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"
为什么?
答案 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_executesql
。 https://msdn.microsoft.com/en-us/library/ms188001.aspx