2017-02-02 4 views
0

У меня есть приложение, выполняющее поиск с несколькими полями для разных критериев.Параметры SQL в трассировке не соответствуют заданным значениям в C#

Search Bar

Мои модели данных, как представляется, обновляя соответствующим образом, когда я отладки, но то, что я прохожу в качестве параметров SQL не исправить, я думаю. След SQL показал мне, что это то, что отправляется в БД.

exec nu_sp_Codetable_GetWSub @address=N'1234 r%', @wo=N'%', @sub=N'%', @daysback=1096, @marketareaid=99, @po=N'%', @plan=N'%', @super=N'%', @builder=N'%'

Мой вопрос связан с теми, «N» перед моими реальными значениями параметров (мы используем модуль по умолчанию, так как причины). Я не знаю, откуда она взялась, если она исходит из моего кода. Вот код, который отправляет этот поиск в БД.

UpdateMainGrid(String.Concat(Address, "%"), "%", "%", SelectedDaysBack, SelectedMarketAreaItem.marketareaid, "%", "%", "%", "%")

Я побежал это как простейшую форму поиска, и вы можете увидеть, где код (для этого конкретного поиска) имеет модуль по умолчанию те жестко закодированное для каждого параметра. В этом примере только переменная Address фактически является установленным значением.

Пара отмечает, что метод обновления, показанный выше, передает литературные строки в классы, которые мы используем для подключения к SQL, поэтому я не предоставил код для этого. Отладка показывает, что данные не изменяются во время этих шагов, это просто отличается в трассировке SQL. Кроме того, другие запросы, которые я искал в трассировке, НЕ включают «N». Я не знаю, какая разница, если таковая имеется.

+0

«N» означает, что значение рассматривается как NVARCHAR вместо VARCHAR. – Crowcoder

+0

Спасибо. Это довольно простой ответ. Я терпеть неудачу в google ... – Jon

ответ

2

N используется в SQL для обозначения строки в Юникоде.

Он обозначает набор символов национального языка.

Многое, как вы можете сделать это в C#:

decimal d = 0.3m;

Лишний м на конце не меняет фактическое значение, это просто более явное представление.

+0

Значит, это абсолютно ничего не значит для инструкции SQL execute? Я могу быть упрощенным, но varchar и nvarchar, хотя и по-разному, не будут иметь никакого другого поведения в этом случае? Я вытолкнул выполнение из трассы вручную и получил тот же недостаток результатов. Я просто хочу быть уверенным, прежде чем начинать анализировать свой SQL-запрос, чтобы понять, почему он не работает. – Jon

+0

Это может иметь значение, особенно с индексами при передаче в nvarchar, но столбец с индексом - varchar, он преобразует столбец в nvarchar для сравнения и не использует ваш индекс. –

+0

Я ошибаюсь, чтобы включить только «%» в качестве параметра при тестировании, или мне нужно поставить «N», как в exec? Кроме того, было бы правильным изменить тип данных параметров в скрипте на nvarchar для соответствия нотации на exec? Я действительно не получаю использование или функцию этой нотации N, и я хочу быть уверенным, что, анализируя мой SQL-запрос, я пойму, почему это не сработало. – Jon

0

По умолчанию параметры отправляются в sql как nvarchar. Это делается для того, чтобы позволить принимать самые широкие возможные значения для параметра и обрабатывать преобразование в тип на основе столбца на сервере. Это N просто определяет строку как Nvarchar, а не varchar.