Использование переменных привязки Oracle с LIKE в C#

В рамках усилий по прекращению использования динамической генерации SQL и поощрению использования переменных связывания я столкнулся с некоторыми проблемами.

Я запрашиваю базу данных Oracle 9i со страницы ASP.NET, используя поставщиков данных Oracle для .NET.

Запрос

sql = "SELECT somedata FROM sometable WHERE machine = :machineName ";

Я определяю параметр Oracle следующим образом

OracleParameter parameter = new OracleParameter();
parameter.ParameterName = "machineName";
parameter.OracleDbType = OracleDbType.Varchar2;
parameter.Value = machine; //machine is a variable of type string
parameterList.Add(parameter);

Это отлично работает для оператора "=". Но я просто не могу заставить его работать с "LIKE". Я не знаю, как отформатировать запрос, чтобы он допускал использование подстановочного знака «%».

Я пытался:

sql = "SELECT somedata FROM sometable WHERE machine LIKE :machineName% ";
sql = "SELECT somedata FROM sometable WHERE machine LIKE ':machineName%' ";
sql = "SELECT somedata FROM sometable WHERE machine LIKE :machineName||% ";

а также:

parameter.Value = machine+'%';

но все, что я получаю, это исключения ORA-00911 (недопустимый символ) и ORA-01036 (недопустимое имя/значение).

Что я делаю неправильно?


person PJ.    schedule 24.09.2010    source источник
comment
Дубликат этого вопроса: stackoverflow.com/questions/1412023/   -  person CodingGorilla    schedule 24.09.2010


Ответы (2)


Пытаться:

sql = "SELECT somedata FROM sometable WHERE machine LIKE :machineName || '%' ";

Из-за переменной BIND не нужно заключать ее в одинарные кавычки. Но% нет, поэтому я ожидаю, что его нужно будет инкапсулировать.

person OMG Ponies    schedule 24.09.2010
comment
Вы, сэр, правы. Это был действительно последний вариант, который я пропустил. Спасибо! - person PJ.; 25.09.2010
comment
Большое спасибо за этот ответ! Я работаю над проектом узла с драйвером базы данных оракула и столкнулся с той же проблемой. Просто из любопытства, почему мне нужны две трубы (||) перед подстановочным знаком (%)? - person Dave Cooper; 23.07.2015
comment
@DaveCooper || объединяет «%», это команда для объединения. - person Edgar Carvalho; 26.07.2015
comment
@EdgarRochaCarvalho спасибо! Не знал этого - это также объясняет, почему все время, когда я пытался использовать оператор +, он терпел неудачу! - person Dave Cooper; 27.07.2015
comment
Это помогло мне обойти идентичную проблему в нашем проекте. Спасибо! - person Dan; 03.03.2020

Вот полный пример запроса:

string commandText = "SELECT LastName, FirstName FROM PEOPLE WHERE UPPER(LastName) LIKE '%' || :lastName || '%' AND UPPER(FirstName) LIKE '%' || :firstName || '%'";

string oradb = "yourDatabaseConnectionStringHere"; // Might want to add Using statement for this code and try catch

OracleConnection conn = new OracleConnection(oradb); // C#
conn.Open();
OracleCommand cmd = new OracleCommand
{
     Connection = conn,
     CommandText = commandText,
     CommandType = CommandType.Text
};

/*IMPORTANT: adding parameters must be in order how they are in order in the SQL statement*/
cmd.Parameters.Add(new OracleParameter("lastName", model.LastName.Trim().ToUpper()));
cmd.Parameters.Add(new OracleParameter("firstName", model.FirstName.Trim().ToUpper()));

OracleDataReader dr = cmd.ExecuteReader();
person Dmitri K    schedule 23.04.2021