VBScript不能正确执行sql语句
这次我写了你,因为VBScript是我公司用来从Oracle数据库检索信息的应用程序之一,似乎没有正常工作。以下是事实:VBScript不能正确执行sql语句
-
有代码的一部分执行以下操作:
sSql = "SELECT REQ_PAYMODE" & _ " FROM SYSADM.GBPRESTATIEGROEP" & _ " WHERE 1=1" & _ " AND SLEUTEL = " & sKeyPrestatiegroep Set oRSGBPrest = connADO.execute(sSql) If Not oRSGBPrest.EOF Then sRequestPaymodeKey = oRSGBPrest("REQ_PAYMODE") Else //error handling End If
-
使用为Oracle声明示踪剂(www.aboves.com)我可以捕获相同的声明及其相应的值:
SELECT REQ_PAYMODE FROM SYSADM.GBPRESTAT IEGROEP WHERE 1 = 1 AND SLEUTEL = 1572499
-
现在,VBScript中应该采取的价值和执行另一个查询:
sSql = "SELECT PAM_CODE" & _ " FROM SYSADM.PAYMODES" & _ " WHERE 1=1" & _ " AND PAM_KEY = " & sRequestPaymodeKey Set oRSPaymodes = connADO.execute(sSql)
权在这最后该脚本会抛出一个错误,说:
ORA-009 36:在线XXX缺少表达 - >设置oRSPaymodes = connADO.execute(sSql)< -
这基本上意味着查询中(3)是不正确的,这也意味着由于某种原因sRequestPaymodeKey是空的。我无法确定这是因为这个失败的sql语句没有出现在语句跟踪器中,但这是我能找到的唯一解释。但是,最差的部分是,它在SQLDeveloper上运行查询(2)时(其值为sRequestPaymodeKey来自),它显示的行的值不是null或零。
我想不出在这里可能发生的任何事情,也许它只是一个服务器的事情......不知道。
你们有什么建议吗?任何方式,我可以真正调试一个VBE文件?
非常感谢您的帮助!
您需要将sRequestPaymodeKey转换为与sql的INT对应的vbLong。我假设PAM_KEY是一个INT。记录集将返回一个字符串值。因此,您的代码如下所示:
If IsNumeric(sRequestPaymodeKey) Then
sSql = "SELECT PAM_CODE" & _
" FROM SYSADM.PAYMODES" & _
" WHERE 1=1" & _
" AND PAM_KEY = " & CLng(sRequestPaymodeKey)
Set oRSPaymodes = connADO.execute(sSql)
Else
'do error handling due to bad returned data(empty string?)
End If
此外,请考虑参数化您的查询以防止sql注入。
有一些想法,尝试:
之前
Set oRSPaymodes = connADO.execute(sSql)
,放在一个MsbBox,看到正在执行什么SQL。它有效吗?它会在Oracle查询分析器中运行吗(如果有的话)?以硬编码取代
sRequestPaymodeKey
的有效值。那它有用吗?
好主意DaveB。 – crackedcornjimmy 2010-09-04 17:02:11
你可以添加一些日志记录到你的变量的值写入文件的VB脚本? – BG100 2010-09-03 05:59:27
是的,我已经做到了。我在第一个sql语句中放置了一个msgbox,它显示变量sKeyPrestatiegroep具有正确的值,但它在执行时仅返回没有行 – danboh 2010-09-03 14:31:36
某些东西在这里没有添加。如果oRSGBPrest没有返回任何行,则当您分配sRequestPaymodeKey时应该会收到错误,因为您试图访问空记录集中的字段。 – Tmdean 2010-09-03 15:16:59