Вызов параметризованного запроса Oracle из ADODB в Classic ASP - PullRequest
5 голосов
/ 16 июля 2009

В настоящее время я работаю над классическим проектом ASP, разговаривая с базой данных Oracle. Я пытаюсь найти способ безопасного вызова сценария Oracle PL / SQL и передачи параметров с помощью ADO. В настоящее время решение создает сценарий SQL вручную со встроенными переменными, такими как:

strSQL = "SELECT field1, etc FROM my_table WHERE (field = '" & filter_value & "')"

Это, конечно, некрасиво и небезопасно, и оно открыто для злоупотреблений.

Код, который я до сих пор (украденный из различных не классических веб-сайтов на основе ASP) выглядит так:

dim strSQL, oConn, oCommand, oParam
set oConn = server.createobject("ADODB.Connection")
oConn.Open myConnString

strSQL = "SELECT field1, etc FROM my_table WHERE (field = :filter_field)"

dim oFilteredList
set oFilteredList = Server.CreateObject("ADODB.Command")
oFilteredList.ActiveConnection = oConn
oFilteredList.CommandText = strSQL
oFilteredList.CommandType = adCmdText
oFilteredList.NamedParameters = True

set oParam = oFilteredList.CreateParameter("filter_field", adVarChar, adParamInput, 10, filter_value)
oFilteredList.Parameters.Append oParam

set rsResults = oFilteredList.Execute

Это вызывает ошибку «Объект параметра неправильно определен. Непоследовательная или неполная информация была предоставлена ​​»

Каков правильный метод вызова Oracle / PL / SQL с именованными параметрами из ADO? Мне нужно использовать именованные параметры, потому что реальный код SQL несколько сложнее, а различные параметры используются в команде SQL несколько раз.

1 Ответ

2 голосов
/ 27 августа 2009

Как вы определили filter_value? Если он не объявлен как строка или если вы назначили строку длиной более 10 символов (как вы указали при создании параметра), у вас возникнут проблемы с этим.

Кроме того (и частично для моей собственной справки), именованные параметры не поддерживаются через OraOLEDB (т.е. ADODB).

См. Поставщик Oracle® для OLE DB. Руководство разработчика 11g Release 1 (11.1) или перейдите по ссылке «Параметры команды» в любой из предыдущих версий (8iR3, 9i, 9iR2, 10g, 10gR2):

Параметры команды

При использовании Oracle ANSI SQL, параметры в тексте команды предшествует двоеточие. В ODBC SQL параметры обозначается знаком вопроса (?).

OraOLEDB поддерживает ввод, вывод и входные и выходные параметры для PL / SQL хранимые процедуры и хранимые функции. OraOLEDB поддерживает ввод параметры для операторов SQL.

" Примечание : OraOLEDB поддерживает только позиционное связывание. "

Тем не менее, это не должно иметь никакого отношения к вашему запросу при использовании OraOLEDB:

oFilteredList.NamedParameters = True

Я успешно выполнил запросы именно так, как показывает остальная часть вашего примера в Oracle 10gR2.

Вы не показываете строку подключения, поэтому я должен считать ее действительной. Поведение может отличаться в зависимости от имеющихся там вариантов, поэтому вот что я успешно использую:

`"Provider=OraOLEDB.Oracle;Data Source=TNSNAMES_ENTRY;User ID=XXXX;Password=YYYY;DistribTx=0;"`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...