使用Classic ASP将变量传递给存储过程

时间:2009-12-29 13:41:25

标签: sql stored-procedures asp-classic

好的,所以我试图将一些字符串变量从经典的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变量中的破折号导致我的问题(或者当有数据时,所有其他变量为什么会出现空值...)。我已经尝试了许多引号和抽搐的组合来安抚语法解释器,但无济于事。我究竟做错了什么?有没有更好的方法来执行这个简单的存储过程调用?

4 个答案:

答案 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的值。

这可以帮助您识别问题,这可能是您的语法,也可能是由参数变量中的意外值引起的。