Использование параметров с соединением Oracle ODBC
Вопрос
Я успешно подключаюсь к базе данных 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 (отмечены символом ?
) связаны позицией, поэтому вам необходимо убедиться, что вы добавили OdbcParameter
s в правильном порядке.Их имя тогда не имеет значения, но я бы предложил paramName
, без @
это формат имени, специфичный для SQL Server (или, скорее, Microsoft).
Вы также можете попробовать использовать формат параметров Oracle, который должен распознаваться драйвером Microsoft ODBC для Oracle и вместо этого позволит вам привязываться по имени (хотя в этом нет уверенности на 100%):
- Заменять
?
к:paramName
в вашем запросе. - Назовите свой параметр
paramName
.
Попробуйте использовать «:paramName» вместо «paramName».