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

StackOverflow https://stackoverflow.com/questions/811481

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

бывший.

--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)

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

Это было полезно?

Решение

Здесь немного некромантии, но поскольку я только что столкнулся с подобной проблемой, вот как это работало с 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
  • Параметры не требуют имени, но позиция (и правильный тип) важна

Другие советы

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

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

  • Заменять ? к :paramName в вашем запросе.
  • Назовите свой параметр paramName.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top