ASP和ADO错误:没有给出一个或多个必需参数的值

时间:2009-10-09 02:28:09

标签: sql-server asp-classic vbscript ado

语言是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;

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

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

4 个答案:

答案 0 :(得分:3)

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()

答案 1 :(得分:1)

从代码中删除此行: -

cmd.Prepared = true

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

现在当你添加一个参数时,除了参数集合中已经存在的正确参数外,还添加了它。当你执行“额外”参数时,对于需求是超级的并且被忽略但是发现正确的参数没有设置其值,因此错误。

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

答案 2 :(得分:1)

我明白了。安东尼和罗伯特指出我正确的方向。

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

主要问题是常量不存在。通过放置它们的整数值,我能够使它工作。我想我起初已经意识到这一点,这就是为什么我的原帖对于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

答案 3 :(得分:0)

其他语法:

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