0

我这次给您写信是因为我公司用来从 Oracle 数据库中检索信息的应用程序之一的 VBScript 似乎无法正常工作。以下是事实:

  1. 有部分代码执行以下操作:

    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
    
  2. 使用 Oracle Statement Tracer (www.aboves.com) 我可以捕获具有相应值的相同语句:

    从 SYSADM.GBPRESTATIEGROEP 中选择 REQ_PAYMODE,其中 1=1 且 SLEUTEL = 1572499

  3. 现在,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(值sRequestPaymodeKey的来源)上运行查询 (2) 时,它显示的行的值不是 null 或零。

我想不出这里可能发生的任何其他事情,也许这只是服务器的事情......不知道。

各位有什么建议吗?有什么方法可以实际调试 VBE 文件?

非常感谢您的帮助!

4

2 回答 2

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 注入。

于 2010-09-03T19:41:56.050 回答
1

一些想法可以尝试:

  1. 之前Set oRSPaymodes = connADO.execute(sSql),放入一个 MsbBox 并查看正在执行的 SQL。它有效吗?它会在 Oracle 查询分析器(如果有的话)中运行吗?

  2. 硬编码一个有效值来代替sRequestPaymodeKey. 那它行得通吗?

于 2010-09-03T22:36:20.183 回答