VBScript не выполняет sql statment должным образом - PullRequest
0 голосов
/ 03 сентября 2010

Я пишу вам на этот раз, потому что VBScript, который одно из приложений моей компании использует для извлечения информации из базы данных Oracle, похоже, не работает должным образом.Вот факты:

  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 (www.aboves.com) Я могу записать этот же оператор с соответствующим значением:

    SELECT REQ_PAYMODE FROM SYSADM.GBPRESTATIEGROEP, ГДЕ 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) <- </strong>

Это в основном означает, что запрос в (3) является неправильным, что также означает, что по какой-то причине sRequestPaymodeKey пуст.Я не могу сказать это наверняка, потому что этот ошибочный оператор SQL не появляется в трассировщике операторов, но это единственное объяснение, которое я смог найти.Тем не менее, худшая часть заключается в том, что при выполнении запроса (2) на SQLDeveloper (отсюда и значение sRequestPaymodeKey ) он показывает строку со значением, отличным от нуля или нуля.

Я не могу думать ни о чем другом, что могло бы происходить здесь, может быть, это просто серверная вещь ... понятия не имею.

Любые предложения от вас, ребята?Есть ли способ отладки VBE-файла?

Ваша помощь очень ценится!

Ответы [ 2 ]

1 голос
/ 04 сентября 2010

Несколько идей:

  1. Перед Set oRSPaymodes = connADO.execute(sSql) вставьте MsbBox и посмотрите, какой SQL выполняется.Это действительно?Будет ли он работать в анализаторе запросов Oracle (если он есть)?

  2. Жесткий код, допустимое значение вместо sRequestPaymodeKey.Это работает тогда?

1 голос
/ 03 сентября 2010

Вам необходимо привести sRequestPaymodeKey в качестве vbLong, который соответствует INT в sql Я предполагаю, что 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.

...