Используйте переменные NVARCHAR в ASP.NET, не объявляя их длину - PullRequest
0 голосов
/ 13 марта 2012

У меня есть этот запрос

SELECT COUNT(Email) FROM Blacklist WHERE (Email = @email OR (Email like '@%' AND @email like '%' + Email)) AND (CustomerId = @cid OR CustomerId = -1)

Я хочу посмотреть, начинается ли значение в черном списке с @, и если да, то я также хочу проверить параметр и se, если оно заканчивается значением в черном списке.

(Email like '@%' AND @email like '%' + Email)

Это работает в SqlManager, если я объявляю переменные точно так, как они находятся в таблице, как это.

declare @email as nvarchar(200) = 'firstname.lastname@xyz.com'
declare @cid as integer = 2

SELECT COUNT(Email) FROM Blacklist WHERE (Email = @email OR (Email like '@%' AND @email like '%' + Email)) AND CustomerId = @cid

Значение в черном списке - "@ xyz.com"

Если я удаляю часть (200) из nvarchar (200), она перестает работать.

Так что мой вопрос, как решить эту проблему из .NET C #?

db.AddParameter("@email", SqlDbType.NVarChar, email);

Ответы [ 3 ]

2 голосов
/ 13 марта 2012

Вы не говорите, что означает "перестать работать", что происходит?Вы получили неправильный результат или ошибку?И почему вы удаляете длину из объявления?

Если вы не объявляете переменную длину для nvarchar, то по умолчанию она равна 1 и поэтому будет иметь значение N'f'в этом случае;Я полагаю, вы получаете счет ноль вместо того числа, которое вы ожидаете?Обратите внимание, что nvarchar(200) не является «фиксированной длиной», это означает «максимум 200 символов»;nchar(200) действительно будет фиксированной длины.

В любом случае, не совсем понятно, в чем ваша проблема: длина строки является просто частью объявления переменной в TSQL, и неясно, почему вы можете это сделать.не делать именно то, что вы показали выше.Вы можете объявить переменную как nvarchar(max), чтобы избежать работы с конкретными длинами, если это ваша проблема.

Будет ли это полезно для вас, вероятно, зависит от того, как вы подключаетесь к базе данных (вы упомянули C #, новы используете ADO, LINQ или что-то еще?БД в вашем вопросе действительно является SqlDatabase.

0 голосов
/ 19 июля 2012

У меня была та же проблема, что и у вас, и после долгих проб и ошибок / копаний, я думаю, я понял это.

Я создал скрипту SQL, чтобы продемонстрировать эту проблему: http://sqlfiddle.com/#!3/c0a51/3

По сути, даже если вы можете установить NVARCHAR для строк любой длины, он экономит только столько символов, сколько определено. Поскольку по умолчанию используется длина 1, единственным символом, включенным в оператор LIKE, является первый, в вашем случае первый символ в адресе электронной почты.

Это в основном то, что сказал Marc_S, но с объяснением того, почему x = 'ab' давал нам только 'a'.

UPDATE

С большим копанием я обнаружил, что это верно в отношении того, что произойдет, если вы напишите свой SQL, как я делал в Fiddle. Однако .NET правильно определит длину NVARCHAR по длине вашей строки и объявит переменную соответствующим образом, поэтому у него не будет этой проблемы: http://msdn.microsoft.com/en-us/library/hex23w80. Таким образом, ваш запрос в студии не ведет себя так, как ваше приложение ведет себя.

0 голосов
/ 13 марта 2012

Проблема в том, что (я работаю с Фредриком), когда запрос выполняется из кода C #, он возвращает 0, то есть не помещается в черный список.При выполнении из SQL Managment Studio, где можно (нужно) указать длину параметра, он возвращает 1, т. Е. Находится в черном списке IS.

Мы предположили, что параметру нужен указанный размер (такой же, как в базе данных).Однако, похоже, что он работает из Management Studio, даже если параметр объявлен как nvarchar (100).

Остается вопрос, почему запрос возвращает 0 при выполнении из кода?

...