这次我写信给你,因为我公司用来从Oracle数据库中检索信息的应用程序之一的VBScript似乎无法正常工作。以下是事实:
部分代码执行以下操作:
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
使用Statement Tracer for Oracle(www.aboves.com)我可以使用相应的值捕获相同的语句:
SELECT REQ_PAYMODE FROM SYSADM.GBPRESTATIEGROEP 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-00936:第XXX行缺少表达式 - >设置oRSPaymodes = connADO.execute(sSql)< -
这基本上意味着(3)中的查询不正确,这也意味着由于某种原因 sRequestPaymodeKey 为空。我无法确定这一点,因为这个失败的sql语句没有出现在语句跟踪器中,但这是我能找到的唯一解释。但是,最糟糕的部分是在SQLDeveloper上运行查询(2)时(其中值 sRequestPaymodeKey 来自),它显示的行的值不是null或0
我想不出这里可能发生的任何其他事情,也许这只是服务器的事情......不知道。
你们有什么建议吗?我可以用任何方式调试VBE文件吗?
非常感谢您的帮助!
答案 0 :(得分:1)
您需要将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注入。
答案 1 :(得分:1)
尝试一些想法:
在Set oRSPaymodes = connADO.execute(sSql)
之前,输入一个MsbBox并查看正在执行的SQL。有效吗?它会在Oracle查询分析器中运行吗(如果有)?
硬编码代替sRequestPaymodeKey
的有效值。那会有用吗?