0

今回は、私の会社が Oracle データベースから情報を取得するために使用しているアプリケーションの 1 つが 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. Statement Tracer for Oracle (www.aboves.com) を使用すると、同じステートメントを対応する値でキャプチャできます。

    1=1 および SLEUTEL = 1572499 の SYSADM.GBPRESTATIEGROEP から REQ_PAYMODE を選択します。

  3. ここで、VBScript はその値を取得し、別のクエリを実行することになっています。

    sSql = "SELECT PAM_CODE" & _
              "  FROM SYSADM.PAYMODES" & _
              " WHERE 1=1" & _
              "   AND PAM_KEY = " & sRequestPaymodeKey
    
    Set oRSPaymodes = connADO.execute(sSql)
    

このコードの最後の行で、スクリプトは次のようなエラーをスローします。

ORA-00936: 行XXXに式がありません --> Set oRSPaymodes = connADO.execute(sSql) <--

これは基本的に、(3) のクエリが正しくないことを意味します。これは、何らかの理由でsRequestPaymodeKeyが空であることも意味します。この失敗した sql ステートメントはステートメント トレーサーに表示されないため、これを確実に伝えることはできませんが、それが唯一の説明です。ただし、最悪の部分は、SQLDeveloper (値sRequestPaymodeKeyの取得元) でクエリ (2) を実行すると、null またはゼロ以外の値を持つ行が表示されることです。

ここで他に何が起こっているのか考えられません。サーバーの問題かもしれません...わかりません。

皆さんからの提案はありますか?VBEファイルを実際にデバッグする方法はありますか?

あなたの助けは大歓迎です!

4

2 に答える 2

1

SQLのINTに対応するvbLongとしてsRequestPaymodeKeyをキャストする必要があります。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 に答える