Как использовать параметр с LIKE в Sql Server Compact Edition - PullRequest
11 голосов
/ 16 декабря 2009

Я пытаюсь параметризовать поисковый запрос, который использует ключевое слово LIKE с подстановочным знаком. Исходный SQL имеет динамический SQL, как это:

"AND JOB_POSTCODE LIKE '" + isPostCode + "%' "

Итак, я попробовал это вместо этого, но я получил исключение FormatException:

"AND JOB_POSTCODE LIKE @postcode + '%' "

Редактировать: Я полагаю, что исключение FormatException не будет исходить от Sql Server CE, поэтому, как я и просил, вот как я устанавливаю параметр в своем коде C #. Параметр задается в коде так:

command.Parameters.Add("@postcode", SqlDbType.NVarChar).Value = isPostCode;

Я тоже пробовал:

"AND JOB_POSTCODE LIKE @postcode"

с

command.Parameters.Add("@postcode", SqlDbType.NVarChar).Value = isPostCode + "%";

но это не возвращает никаких результатов. Кто-нибудь может посоветовать, как использовать параметры в этом поиске sql?

Ответы [ 5 ]

21 голосов
/ 17 декабря 2009

Короткий ответ: вы должны поместить подстановочный знак в значение параметра, а не в CommandText. т.е.

не то: sqlCommand.CommandText = "SELECT * FROM JOB WHERE JOB_POSTCODE LIKE @postcode%"

это:

sqlCommand.CommandText = "SELECT * FROM JOB WHERE JOB_POSTCODE LIKE @postcode";
sqlCommand.Parameters.Add("@postcode", SqlDbType.NVarChar).Value = postCode + "%";

Длинный ответ здесь:

Я вернулся и разобрал свой код до самого необходимого, чтобы я мог опубликовать его здесь, и при этом я обнаружил, что последний метод, который я попробовал в моем первоначальном вопросе, действительно работает. Должно быть, что-то не так в моем тестировании. Итак, вот резюме с полным кодом, который был запущен:

Исходный динамический sql, уязвимый для инъекций sql:

//Dynamic sql works, returns 2 results as expected, 
//but I want to use parameters to protect against sql injection

string postCode = "G20";
sqlCommand.CommandText = "SELECT * FROM JOB WHERE JOB_POSTCODE LIKE '" 
                         + postCode + "%'";
return Database.fGetDataSet(sqlCommand, 
                            iiStartRecord, 
                            iiMaxRecords, 
                            "JOBVISIT");

Первая попытка использования параметра выдает ошибку:

//This syntax with a parameter gives me an error 
//(note that I've added the NVarChar length as suggested:
//System.FormatException : @postcode : G20 - 
//Input string was not in a correct format.
//at System.Data.SqlServerCe.SqlCeCommand.FillParameterDataBindings()
//at System.Data.SqlServerCe.SqlCeCommand.ExecuteCommandText(IntPtr& pCursor,
// Boolean& isBaseTableCursor)

string postCode = "G20";
sqlCommand.CommandText = "SELECT * FROM JOB WHERE JOB_POSTCODE LIKE @postcode 
                         + '%'";
sqlCommand.Parameters.Add("@postcode", 
                          SqlDbType.NVarChar, 
                          10).Value = postCode;
return Database.fGetDataSet(sqlCommand, iiStartRecord, iiMaxRecords, "JOBVISIT");

Вторая техника действительно работает:

///This syntax with a parameter works, returns 2 results as expected
string postCode = "G20";
sqlCommand.CommandText = "SELECT * FROM JOB WHERE JOB_POSTCODE LIKE @postcode";
sqlCommand.Parameters.Add("@postcode", SqlDbType.NVarChar).Value = postCode 
                                                                   + "%";
return Database.fGetDataSet(sqlCommand, iiStartRecord, iiMaxRecords, "JOBVISIT");

Спасибо за все комментарии и извините за оригинальный вводящий в заблуждение вопрос ...

3 голосов
/ 16 декабря 2009

Это возвращает соответствующие результаты в SQL Server 05 (также работает в SP), поэтому кажется, что последнее, что вы попробовали, должно было сработать. Но у меня нет тестового стенда для Compact Edition, так что, возможно, это что-то меняет (мне было бы интересно узнать, так ли это и почему).

declare @p1 nvarchar(50)
set @p1 = 'f'         -- initial value passed from your app
set @p1 = @p1 + '%'   -- edit value for use with LIKE
select * from JOB
where JOB_POSTCODE like @p1

EDIT:

Какую версию SQLCE вы используете? Можете ли вы сказать, действительно ли значения ваших параметров передаются из вашего кода в БД? Я пролистал это руководство по MSDN и смог получить результаты, которые вы ищете, по крайней мере, из Visual Studio Query Designer. (единственное отличие состоит в том, что я использую VS 2008 и SQL Server Compact 3.5). Смотрите раздел под названием «Создание нового запроса»; Я смоделировал таблицу с некоторыми данными, и этот запрос работал, как вы и предполагали.

SELECT     JobID, PostCode, OtherValue
FROM         Job
WHERE     (PostCode LIKE @p1 + '%')

Как я уже сказал, я не писал никакого кода для вызова запроса, но он работал внутри дизайнера. Другими словами, «это работает на моей машине».

2 голосов
/ 16 декабря 2009

Использование:

"AND JOB_POSTCODE LIKE '" + isPostCode + "%' "

... означает, что строка создается перед прикреплением к динамическому SQL. Это так, что вам не нужно указывать параметр в списке параметров для sp_executesql / EXEC, а это:

"AND JOB_POSTCODE LIKE @postcode + '%' "

... делает. Пожалуйста, оставьте больше запроса.

1 голос
/ 16 декабря 2009

Пожалуйста, оставьте свой полный пример (включая код внешнего клиента, где вы собираете вызов). Если вы правильно передаете параметр, ваш второй и третий параметры должны работать. Вы вызываете это в хранимой процедуре или встроенном параметризованном SQL?

Я не предполагаю, что SP, так как я вижу, что вы используете CE ...

Я думаю, вам нужно добавить длину к вашему .Add вызову , так как это nvarchar.

0 голосов
/ 10 сентября 2016

Ваш ответ:

"AND JOB_POSTCODE LIKE '' + @postcode + '%' "

и параметр:

command.Parameters.Add("@postcode", SqlDbType.NVarChar).Value = isPostCode;
...