Использование параметров с соединением Oracle ODBC

Я успешно подключаюсь к базе данных Oracle 10g с помощью драйвера Microsoft ODBC для Oracle.

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

ex.

--this works fine
Select * from tbl1 where column1 = 'test'

--this doesn't
select * from tbl1 where column1 = ?

--odbc string parameter 'test'

Вот как выглядит моя строка подключения:

"Driver={Microsoft ODBC for Oracle}; " & _
 "CONNECTSTRING=(DESCRIPTION=" & _
 "(ADDRESS=(PROTOCOL=TCP)" & _
 "(HOST=" & pstrServer & ")(PORT=" & pintPort.ToString & "))" & _
 "(CONNECT_DATA=(SERVICE_NAME=" & pstrPhysicalName & "))); " & _
 "uid=" & pstrUserName & ";pwd=" & pstrPassword & ";"

И я добавляю параметры в свою команду ODBC следующим образом:

arrOdbcParam(index) = New OdbcParameter("@paramName", paramValue)

...

cmd.Parameters.AddRange(arrOdbcParam)

Простите частично скопированный, несколько псевдокод.


person Gaidin    schedule 01.05.2009    source источник


Ответы (3)


Здесь немного некромантии, но поскольку я только что боролся с похожей проблемой, вот как это работало с ODBC-драйвером для Centura SQLBase:

OdbcCommand com = con.CreateCommand();
com.CommandText = @"
  SELECT  thing
  FROM    table
  WHERE   searchInt = ? AND searchDat = ?";
com.Parameters.Add(new OdbcParameter("", OdbcType.Int)).Value = 12345;
com.Parameters.Add(new OdbcParameter("", OdbcType.DateTime)).Value = DateTime.Now;
OdbcDataReader reader = com.ExecuteReader();

Это ищет в "таблице" записи со значением 12345 в "searchInt" и сегодняшней датой в "serachDat".
На что следует обратить внимание:

  • Параметры помечены как ? в команде SQL
  • Параметры не нуждаются в имени, но важны позиция (и правильный тип)
person Stephan Keller    schedule 19.01.2010
comment
Нашел это решение, и оно сработало для меня, с одним примечанием для будущих посетителей, которые найдут этот вопрос: я использовал одиночные галочки вокруг моих критериев where ( где mystring = '?' ); они вам не нужны. (Обратите внимание, что спрашивающий их тоже не использовал.) (Стефан, это действительно не имеет ничего общего с вашим ответом в частности) - person Lynn Crumbling; 10.05.2012

Параметры ODBC (отмеченные символом ?) связаны по положению, поэтому вы должны убедиться, что добавляете OdbcParameter в правильном порядке. Тогда их имя не имеет значения, но я бы предложил paramName без @, который является специфическим для SQL Server (или, скорее, Microsoft) форматом имени.

Вы также можете попробовать использовать формат параметра Oracle, который должен распознаваться драйвером Microsoft ODBC для Oracle и вместо этого позволит вам выполнять привязку по имени (хотя и не на 100% уверен в этом):

  • Замените ? на :paramName в своем запросе.
  • Назовите свой параметр paramName.
person Mac    schedule 04.05.2009
comment
Только что попробовал это, и это все еще не работает. Я продолжаю связывать не все переменные. - person Gaidin; 07.05.2009
comment
Вы не можете использовать именованные параметры с Microsoft ODBC для Oracle. Параметр должен быть указан с помощью ? и параметры добавляются в правильном порядке. Попробуйте использовать AddWidthValue(,paramValue) вместо AddRange(). - person Liao; 16.12.2009

Попробуйте использовать ":paramName" вместо "paramName".

person ajh1138    schedule 01.05.2009
comment
Имена моих параметров обычно @paramName. является ли :paramName синтаксисом Oracle? Обычно я больше работаю с SQL Server, поэтому я плохо знаком с некоторыми вариантами синтаксиса Oracle. - person Gaidin; 01.05.2009
comment
@Gaidin Целых десять лет спустя, но я могу подтвердить, что это так - я также обычно работаю с сервером sql, так что это было для меня неожиданностью. Синтаксис Oracle odbc, по-видимому, использует :имя_переменной в запросе, сопоставленном с именем_переменной (без двоеточия) в списке параметров. дурацкий. - person neminem; 24.09.2020