语言是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;
编辑:我删除了导致类型不匹配错误的代码,因为它确实无关紧要。
编辑:我在这里删除了我的答案并将其作为“答案”发布在下面。答案 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