在ADODB中使用参数时出错

时间:2016-10-05 11:00:39

标签: sql-server vba

Dim strSQL As String

strSQL = "INSERT INTO [" & AccountCode & "].[Orders] ( OrderID,OrderDate,BarUTC,OrderUTC,Exchange,Symbol,OrderSignedAmount,OrderPrice,Type,TargetPosition,AccountIdent,Status)" _
          & " VALUES ( @OrderID,@OrderDate,@BarUTC,@OrderUTC,@Exchange,@Symbol,@OrderSignedAmount,@OrderPrice,@Type,@TargetPosition,@AccountIdent,@Status)"

Dim cmd As New ADODB.Command
Set cmd.ActiveConnection = objMyConn

cmd.CommandText = strSQL
cmd.CommandType = adCmdText
cmd.NamedParameters = True
SeqNum = SeqNum + 1
AccountIdent = AccountCode + ":" + ModelCode
cmd.Parameters.Append cmd.CreateParameter("@OrderID", adInteger, adParamInput, -1, SeqNum)
cmd.Parameters.Append cmd.CreateParameter("@OrderDate", adDate, adParamInput, 0, Date)
cmd.Parameters.Append cmd.CreateParameter("@BarUTC", adDBTimeStamp, adParamInput, 0, Time)
cmd.Parameters.Append cmd.CreateParameter("@OrderUTC", adDBTimeStamp, adParamInput, 0, Time)
cmd.Parameters.Append cmd.CreateParameter("@Exchange", adVarChar, adParamInput, -1, "Future")
cmd.Parameters.Append cmd.CreateParameter("@Symbol", adVarChar, adParamInput, -1, Symbol)
cmd.Parameters.Append cmd.CreateParameter("@OrderSignedAmount", adInteger, adParamInput, , TargetPosition)
cmd.Parameters.Append cmd.CreateParameter("@OrderPrice", adDouble, adParamInput, , -1)
cmd.Parameters.Append cmd.CreateParameter("@Type", adVarChar, adParamInput, -1, "MARKETIOC")
cmd.Parameters.Append cmd.CreateParameter("@TargetPosition", adInteger, adParamInput, , TargetPosition)
cmd.Parameters.Append cmd.CreateParameter("@AccountIdent", adVarChar, adParamInput, -1, AccountIdent)
cmd.Parameters.Append cmd.CreateParameter("@Status", adVarChar, adParamInput, -1, "NEW")

cmd.Execute

这给了我一个"必须声明标量变量错误" @ OrderID"

为什么?

1 个答案:

答案 0 :(得分:1)

您无法像在尝试的那样在SQL命令文本中命名参数。

如果你将所有这些改为“?”占位符然后你的代码应该工作,例如

Dim strSQL As String

strSQL = "INSERT INTO [" & AccountCode & "].[Orders] ( OrderID,OrderDate,BarUTC,OrderUTC,Exchange,Symbol,OrderSignedAmount,OrderPrice,Type,TargetPosition,AccountIdent,Status)" _
          & " VALUES ( ?,?,?,?,?,?,?,?,?,?,?,?)"

Dim cmd As New ADODB.Command
Set cmd.ActiveConnection = objMyConn

cmd.CommandText = strSQL
cmd.CommandType = adCmdText
cmd.NamedParameters = True
SeqNum = SeqNum + 1
AccountIdent = AccountCode + ":" + ModelCode
cmd.Parameters.Append cmd.CreateParameter("@OrderID", adInteger, adParamInput, -1, SeqNum)
cmd.Parameters.Append cmd.CreateParameter("@OrderDate", adDate, adParamInput, 0, Date)
cmd.Parameters.Append cmd.CreateParameter("@BarUTC", adDBTimeStamp, adParamInput, 0, Time)
cmd.Parameters.Append cmd.CreateParameter("@OrderUTC", adDBTimeStamp, adParamInput, 0, Time)
cmd.Parameters.Append cmd.CreateParameter("@Exchange", adVarChar, adParamInput, -1, "Future")
cmd.Parameters.Append cmd.CreateParameter("@Symbol", adVarChar, adParamInput, -1, Symbol)
cmd.Parameters.Append cmd.CreateParameter("@OrderSignedAmount", adInteger, adParamInput, , TargetPosition)
cmd.Parameters.Append cmd.CreateParameter("@OrderPrice", adDouble, adParamInput, , -1)
cmd.Parameters.Append cmd.CreateParameter("@Type", adVarChar, adParamInput, -1, "MARKETIOC")
cmd.Parameters.Append cmd.CreateParameter("@TargetPosition", adInteger, adParamInput, , TargetPosition)
cmd.Parameters.Append cmd.CreateParameter("@AccountIdent", adVarChar, adParamInput, -1, AccountIdent)
cmd.Parameters.Append cmd.CreateParameter("@Status", adVarChar, adParamInput, -1, "NEW")

cmd.Execute

此时,在创建命令参数时,您调用它们并不重要。请注意,参数是按顺序位置传递的,而不是名称!

如果你想很好地命名SQL代码中的参数,那么你应该考虑创建一个存储过程,尽管你的动态模式名​​称会变得很棘手。

您也可以使用sp_executesqlhttps://msdn.microsoft.com/en-us/library/ms188001.aspx