2010-12-26 4 views
0

Я использую ADO.NET для подключения к Oracle DB через ODBC. Все работает отлично, кроме связывания параметров с помощью простого запроса SQL:Добавление параметров в предложение WHERE SQL-запроса

Connection.Open(); 
IDbCommand command = Connection.CreateCommand(); 
command.CommandText = "SELECT length FROM activity_type WHERE name = :name_of_activity"; 
var parameter = command.CreateParameter(); 
parameter.ParameterName = ":name_of_activity"; 
parameter.Value = "Short_break"; 
command.Parameters.Add(parameter); 
int result = Convert.ToInt32(command.ExecuteScalar()); 
Connection.Close(); 

Он всегда возвращает 0 результат (а нуль из ExecuteScalar() - то же от читателя). Но если бы я поставил простой SQL-запрос вроде этого: command.CommandText = "SELECT length FROM activity_type WHERE name = 'Short_break'" он работал бы как шарм. Более того, я использовал подобные конструкции по всему коду для статей INSERT INTO, и все было в порядке.

Я что-то упустил?

ответ

6

Из документов для OdbcCommand.Parameters:

Когда CommandType установлен в текст, Поставщик данных .NET Framework для ODBC не поддерживает прохождение именованных параметров в операторе SQL или хранимой процедуры, называемой помощью OdbcCommand , В любом из этих случаев используйте знак вопроса (?). Например:

SELECT * FROM Customers WHERE CustomerID = ? 

Другими словами, ваш код должен выглядеть следующим образом:

Connection.Open(); 
IDbCommand command = Connection.CreateCommand(); 
command.CommandText = "SELECT length FROM activity_type WHERE name = ?"; 
var parameter = command.CreateParameter(); 
parameter.Value = "Short_break"; 
command.Parameters.Add(parameter); 
int result = Convert.ToInt32(command.ExecuteScalar()); 
Connection.Close(); 

(Вы, вероятно, следует рассматривать, используя using заявления, заметьте ... в противном случае, если это бросает исключение, вы не будете закрывать соединение.)

+0

Большое спасибо за ваш ответ. Я попробовал «?» заполнитель до, без везения. Все тот же результат. Именованные параметры работают в любой другой части кода. Я извлек код из проекта, изначально 'Connection.Close()' находится в разделе 'finally'. – mcmil

+0

@M_F: Это действительно «OdbcCommand»? Трудно сказать из довольно общего кода. К сожалению, разные поставщики поддерживают различные формы параметризованных запросов. Пробовали ли вы просматривать журналы базы данных, чтобы узнать, что происходит? –

+0

Да, это OdbcCommand. Соединение создается как «IdbConnection Connection = новое OdbcConnection (« DSN = oracle; UID = xxx; PWD = xxx »);'. Спасибо, я пытаюсь добраться до журналов. – mcmil

0

От того, что вы описываете проблему, может быть только параметр.

Возможно, какое-то странное смешение между varchar и nvarchar на SQL Server, другими словами, попробуйте установить тип данных явно.

0

Попробуйте изменить эту строку:

parameter.ParameterName = ":name_of_activity"; 

в

parameter.ParameterName = "name_of_activity"; 

Другими словами удалить символ двоеточие