首页>Program>source

我主要是一名PHP开发人员,但是我有一些旧的ASP,这是我们以前的开发人员中的一位失败了,所以我不知道如何解决它.我们有一个程序,该程序将一些变量发送到侦听器页面,该页面将数据与msSQL数据库的注册代码进行比较,然后让该程序知道注册代码是否有效.

我收到以下错误,其中

.Parameters.Append .CreateParameter("@code", adVarChar, 1, 50, x)

是第134行:

ADODB.Parameters error '800a0e7c'

Parameter object is improperly defined. Inconsistent or incomplete information was provided.

/checkregistrationpro.asp, line 134

我已经在代码中未包含的包含文件中指定了任何命名常量,因此与之无关。

我的连接字符串(我已经确认这些设置正确):

set conn = Server.CreateObject("ADODB.Connection")
set cmd = Server.CreateObject("ADODB.Command")
sConnString = "Provider=sqloledb; Data Source=MYDATASOURCE; Initial Catalog=MYCATALOG; User ID=MYUSERID; Password='MYPASSWORD';"
conn.Open sConnString

我的代码:

...
Function BlockInjectCode(StrVal)
    BlockInjectCode = Replace(StrVal,"--","")
    BlockInjectCode = Replace(BlockInjectCode,"'","")
    BlockInjectCode = Replace(BlockInjectCode,"""","")
    if instr(lcase(BlockInjectCode),"<") > 0 then
        BlockInjectCode = ""
    end if
End Function
    x = BlockInjectCode(Request.QueryString("rid"))
    uid = BlockInjectCode(Request.QueryString("uid"))
    chkcode = BlockInjectCode(Request.QueryString("Code"))
    CheckPro = BlockInjectCode(Request.QueryString("pro"))
    CheckProProd = BlockInjectCode(Request.QueryString("prod"))
    CheckProMac = BlockInjectCode(Request.QueryString("mac"))
    MacAdd = CheckProMac
    CodeValid = False
    if x <> "" and uid <> "" then
        '-- Get information about this registration code.   
        sqlStr = "select * from MYTABLE where Code = ? and IsValid = 1"
        set cmdCodes = Server.CreateObject("ADODB.Command")
        Set cmdCodes.ActiveConnection = Conn
        cmdCodes.CommandText = sqlStr
        with cmdCodes
            .Parameters.Append .CreateParameter("@code", adVarChar, 1, 50, x)
        end With    
        Set rsCodes = cmdCodes.execute      
...

Problem Solved: 对于手动定义adVarChar为何不起作用,我仍然不清楚.但是,会发生人为错误.通过创建一个引用msado15.dll的global.asa文件,我能够解决此问题.有关明确说明,请参见下面的Ryios帖子。

最新回答
  • 2020-12-26
    1 #

    常见的情况可能是您没有 adVarChar 定义,所以 CreateParameter() 方法是"定义不正确"

    这只是ADODB库中找到的许多命名常量之一的示例.解决这个问题的麻烦方法是自己定义值;

    Const adVarChar = 200
    

    这种方法的问题是您必须定义所有命名的常量,这可能很麻烦.另一种方法是只跳过整个命名的常量事物,而只使用整数值,因此调用应为

    .Parameters.Append .CreateParameter("@code", 200, 1, 50, x)
    

    尽管看起来好像您已经在使用 ParameterDirectionEnum一样进行操作,但这并不容易阅读 1的value 这就是命名的常量 adParamInput 在ADODB库中.无论如何,我都不会推荐这种方法。

    一种更好的方法是使用 #include 指令,以便它可以在调用页面中包含您可能需要的所有命名常量定义,而这正是大多数这样做的方式. Microsoft为此目的通过IIS(或可能不确定的MDAC库安装)提供了一个预定义的文件,称为 adovbs.incadovbs.asp ,通过包含此文件,您的页面将可以访问其中的所有命名常量定义。

    所有这些的原因是VBScript不支持类型库,因此在Client方案中,您可以自行定义它们或从 adovbs.inc复制和粘贴 文件是您唯一的选择.但是,在服务器方案中,我们仍然具有IIS的功能,可以让我们做一些时髦的事情。

    如果类型库可以只添加一次并且您不必担心它,这会很好吗?不需要烦人的常量来定义吗? 面对它们,它们已经存在于类型库中了,为什么我们不能从那里获取它们呢? 好吧,我们可以感谢 METADATA 指令。

    这里是一个例子;

    <!--
       METADATA    
       TYPE="TypeLib"    
       NAME="Microsoft ActiveX Data Objects 2.5 Library"    
       UUID="{00000205-0000-0010-8000-00AA006D2EA4}"    
       VERSION="2.5"
    -->
    

    这种方法的优点是您可以将其用于任何类型库(最好公开给COM),并且可以在一页中进行定义,也可以将其添加到 global.asa中 在整个web应用程序中进行定义。

    通过这种方法,您可以放心使用类似的代码;

    .Parameters.Append .CreateParameter("@code", adVarChar, adParamInput, 50, x)
    

    有用链接

      VBScript ADO Programming

      Answer to ASP 3.0 Declare ADO Constants w/out Including ADOVBS.inc

      Answer to Passing Parameters to a Stored Procedure using ASP

      Using METADATA to Import DLL Constants

    p

    在定义adVarChar和其他ADO幻数的地方,完全删除它们。

    相反,请将其添加到global.asa的顶部(如果不存在则创建一个)。

    <!--METADATA TYPE="TypeLib" file="C:\Program Files (x86)\Common Files\System\ado\msado15.dll" -->
    

    这将导入msado15类型库,该库已经定义了所有这些幻数.它将自动为您提取所有定义.意味着您不必自己定义adVarChar等,元数据标签将自动为您导入它们.感谢@Lankymart的意见,因为他的评论使我发现了这个问题并将其弄清楚,而且效果很好。

    现在,打开一个空白的测试ASP页面,并在显式打开选项的基础上向其中添加一些测试代码。

    <%
        Option Explicit
        Response.Write "adVarChar: " & adVarChar
    %>
    

    如果收到未定义adVarChar的错误,则说明msado15.dll不在服务器上.因此,您将需要与Godaddy等联系,以使他们告诉您那里存在的MSADO版本的路径,并更改元数据标记以引用正确的版本。

  • xslt中的动态xpath?
  • java:如何循环用户输入直到输入整数?