Использование переменных связывания 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 (недопустимое имя / значение).
Что я делаю неправильно?
2 ответа
Пытаться:
sql = "SELECT somedata FROM sometable WHERE machine LIKE :machineName || '%' ";
Из-за переменной BIND вокруг нее не должно быть одинарных кавычек. Но% нет, так что я ожидаю, что его нужно заключить в капсулу.
Вот полный пример запроса:
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();