【问题标题】:ASP and ADO error: No value given for one or more required parametersASP 和 ADO 错误:没有为一个或多个必需参数提供值
【发布时间】:2009-10-09 02:28:09
【问题描述】:

语言是 vbscript 和经典的 ASP。

当值在 sql 语句中硬编码时,以下 SQL 有效:

sql = "UPDATE STORE2_ITEM SET sku = 'abcd' WHERE id = 224 and host_id = 1"

我正在尝试添加参数,因此我将 field1 赋值替换为以下内容:

sql = "UPDATE STORE2_ITEM SET sku = ? WHERE id = 224 and host_id = 1"

(暂时保持简单,看看我是否可以让这个参数起作用)。

我收到以下错误:

“没有为一个或多个必需参数指定值。”

其余代码如下:

Set DynaDb = Server.CreateObject("ADODB.Connection")
DynaDB.ConnectionString = STORE_CONNECTION_STRING
DynaDb.Open

sql = "UPDATE STORE2_ITEM SET sku = ? WHERE id = 224 and host_id = 1"

Set cmd = Server.CreateObject("ADODB.Command")
cmd.CommandText = sql

cmd.CommandType adCmdText
cmd.Prepared = true

cmd.Parameters.Append(cmd.CreateParameter("", 200, 1, "AbcD"))

cmd.ActiveConnection = DynaDB
cmd.Execute

其他信息: 连接字符串: Provider=SQLOLEDB.1;Data Source=xxxxxxx;Initial Catalog=xxxxxx;Persist Security Info=True;User ID=xxxx;User Id=mkj;PASSWORD=xxxxxx;

编辑:我删除了导致类型不匹配错误的代码,因为它确实不相关。

编辑:我在这里删除了我的答案,并将其发布为下面的“答案”。

【问题讨论】:

    标签: sql-server asp-classic vbscript ado


    【解决方案1】:

    ADODB SQL Server 命令字符串中参数的语法是:

    @ParameterName
    

    下面是一些示例代码:

    Dim rst As ADODB.Recordset
    
    Set cmd = New ADODB.Command
    
    cmd.ActiveConnection = "Provider=SQLOLEDB.1;Data Source=(local);" & 
    "Integrated Security=SSPI;Initial Catalog=DatabaseName"
    
    cmd.CommandText = "DECLARE @PARAMETER1 datetime, @PARAMETER2 datetime, 
    @PARAMETER3 bit;" & _
    "SELECT * FROM blah, blah.... " & _
    "WHERE something>= @PARAMETER3 AND " & _
    "something BETWEEN @PARAMETER1 AND @PARAMETER2"
    
    cmd.CommandType = adCmdText
    
    Set PARAMETER1 = cmd.CreateParameter("@PARAMETER1", adDate, adParamInput)
    cmd.Parameters.Append PARAMETER1
    PARAMETER1.Value = "01/01/2000"
    
    Set PARAMETER2 = cmd.CreateParameter("@PARAMETER2", adDate, adParamInput)
    cmd.Parameters.Append PARAMETER2
    PARAMETER2.Value = "05/01/2007"
    
    Set PARAMETER3 = cmd.CreateParameter("@PARAMETER3", adInteger, adParamInput)
    cmd.Parameters.Append PARAMETER3
    PARAMETER3.Value = 0
    
    Set rst = New ADODB.Recordset
    Set rst = cmd.Execute()
    

    【讨论】:

    • 这两个例子我都看过。使用@name 符号,显然您必须声明它们。我也见过使用“?”的例子为他们。但是,我确实使用命名参数进行了尝试,结果我更新了帖子
    • 格式?? a) VBScript 中没有 Format 函数,b) 为什么将日期格式化为字符串,只需将日期作为日期传递,这是使用不需要这种格式化的参数的巧妙之处。
    【解决方案2】:

    从您的代码中删除这一行:-

    cmd.Prepared = true
    

    当您使用此行(或尝试在向其添加任何内容之前尝试对 Parameters 集合进行索引)时会发生什么,即 ADO 往返于 DB 服务器请求执行命令所需的参数集。因此,此行会为您创建所需的参数条目,但没有值。

    现在,当您添加参数时,除了参数集合中已经存在的正确参数之外,它还会添加。当您执行时,您的“额外”参数对要求是多余的并被忽略,但发现正确的参数没有设置其值,因此出现错误。

    通过删除您自己承担的正确配置参数集合的行,因此不需要额外的往返来创建集合。假设您添加了所有正确的参数,它应该可以工作。

    【讨论】:

      【解决方案3】:

      我想通了。安东尼和罗伯特为我指明了正确的方向。

      我意识到虽然错误消息告诉我出了什么问题,但它似乎误导了我。当我的参数未正确声明时,它会给我上面的错误。

      主要问题是常量不存在。通过输入它们的整数值,我能够让它工作。我想我一开始就意识到了这一点,这就是为什么我的原始帖子中的 adVarChar 为“200”。所以,我只是在我的 asp 顶部声明了这些变量(顺便说一句,有人知道如何将这些常量包含在其中吗?)。

      此外,它似乎需要参数的大小(即 adVarChar 的 50)。 所以,我的最终代码看起来像这样(:

      ' Data Types
      adInteger = 3
      adVarChar = 200
      adDecimal = 14
      
      ' Direction Constants
      adParamInput = 1
      adParamOutput = 2
      
      On Error Resume Next
      Set conn = Server.CreateObject("ADODB.Connection")
      Set cmd = Server.CreateObject("ADODB.Command")
      
      conn.ConnectionString = "Provider=SQLOLEDB.1;Data Source=BRYCE-PC7\SQLEXPRESS;Initial Catalog=Funeral;Persist Security Info=True;User ID=mkj;PASSWORD=jibenear32;"
      conn.Open
      
      cmd.ActiveConnection = conn
      cmd.CommandType = 1
      cmd.CommandText = "UPDATE STORE2_ITEM SET sku = ? WHERE id = 224 and host_id = 1"
      
      Set param = cmd.CreateParameter(, adVarChar, adParamInput, 50)
      param.Value = "NEW SKU"
      
      cmd.Parameters.Append param
      
      cmd.Execute
      

      【讨论】:

        【解决方案4】:

        其他语法:

        with server.createobject("adodb.command")
          .activeConnection = application("connection_string")
          .commandText "update sometable set some_col=?"
          .execute , array(value)
        end with
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多