Добавление параметров в предложение WHERE SQL-запроса - PullRequest
0 голосов
/ 26 декабря 2010

Я использую ADO.NET для подключения к БД Oracle через ODBC.Все работает нормально, кроме привязки параметров с помощью простого запроса 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, и они были в порядке.

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

Ответы [ 3 ]

7 голосов
/ 26 декабря 2010

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

Когда для CommandType установлено значение Text, поставщик данных .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 голосов
/ 27 декабря 2010

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

parameter.ParameterName = ":name_of_activity";

до

parameter.ParameterName = "name_of_activity";

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

0 голосов
/ 27 декабря 2010

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

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

...