好的,所以我试图将一些字符串变量从经典的ASP页面传递到MSSQL2000 db:
strSQL = "exec UpdateEvent " & xID & ",'" & xEventID & "'," & xEventDisplayName & "," & xEventType & "," & xEventStatus & "," & xStartDate & "," & xEndDate & "," & xSurveyTemplateID & ""
然而我最终得到了错误(包括写出strSQL内容):
exec UpdateEvent 1,'1-44KTDL',,,,,,
Microsoft OLE DB Provider for SQL 服务器错误'80040e14'
第1行:','附近的语法不正确。
/eventedit.asp,第225行
现在我不确定它是否是EventID变量中的破折号导致我的问题(或者当有数据时,所有其他变量为什么会出现空值...)。我已经尝试了许多引号和抽搐的组合来安抚语法解释器,但无济于事。我究竟做错了什么?有没有更好的方法来执行这个简单的存储过程调用?
答案 0 :(得分:5)
那非常糟糕;您的代码受SQL注入攻击,需要尽快修复。
<!--#include virtual="/ASPSAMP/SAMPLES/ADOVBS.INC"-->
<%
Set cmd = Server.CreateObject("ADODB.Command")
' ... open connection and stuff ... '
cmd.CommandText = "UpdateEvent"
cmd.CommandType = adCmdStoredProc
cmd.Parameters.Refresh
cmd.Parameters(1) = xID
cmd.Parameters(2) = xEventID
cmd.Parameters(3) = xEventDisplayName
cmd.Parameters(4) = xEventType
cmd.Parameters(5) = xEventStatus
cmd.Parameters(6) = xStartDate
cmd.Parameters(7) = xEndDate
cmd.Parameters(8) = xSurveyTemplateID
cmd.Execute
%>
答案 1 :(得分:1)
如果这些变量不存在数据,则至少需要在其中放置NULL,否则SQL将失败。
例如,如果您粘贴
exec UpdateEvent 1,'1-44KTDL',,,,,,
直接进入查询分析器,你会得到同样的错误。
理想情况下,您需要将它们加载到参数数组中,并在没有数据的情况下为每个参数创建默认值(例如NULL)。
这将确保您的存储过程正确构建。
e.g。
exec UpdateEvent 1,'1-44KTDL', NULL, NULL, NULL, NULL, NULL, NULL
答案 2 :(得分:0)
答案 3 :(得分:0)
我建议您捕获代码中生成的SQL&gt;在数据库中手动运行该SQL&gt;看看你是否能发现问题。
在代码中设置一个断点,其中填充了strSQL。跨过那条线。在那时获取strSQL的值。
这可以帮助您识别问题,这可能是您的语法,也可能是由参数变量中的意外值引起的。