C #: DbType.String против DbType.AnsiString - PullRequest
19 голосов
/ 08 марта 2011

Я взял некоторый код C #.

Код попадает в базу данных с некоторым количеством SQL, в котором используются параметры.

Все строковые параметры набираются как DbType.AnsiString вместо DbType.String.

Почему бы вам использовать DbType.AnsiString вместо DbType.String?

Ответы [ 3 ]

30 голосов
/ 08 марта 2011

AnsiString
Поток переменной длины, не являющийся символами Unicode, в диапазоне от 1 до 8000 символов.

String
Тип, представляющий строки символов Unicode.

В базе данных:

nchar и nvarchar - это Unicode

char и varchar - не являются Unicode

10 голосов
/ 13 февраля 2013

Вы бы использовали ansistring вместо строки, чтобы избежать неявных преобразований в вашей базе данных SQL Server.

т.е. когда вы передаете строковую переменную в MSSQL, она выглядит как nvarchar (max). Учитывая тот факт, что хорошо спроектированная база данных в MSSQL может по умолчанию использовать varchars, а не nvarchars (если нет бизнес-требований для нелатинских наборов символов).

Строковая переменная в этом случае вызовет неявное преобразование в базе данных. Это может затем сделать движок неспособным использовать определенные индексы и выполнить полное сканирование таблицы (один из корней зла для производительности БД)

0 голосов
/ 17 апреля 2019

Почему вы используете DbType.AnsiString вместо DbType.String?

Краткий ответ: Когда ваш SqlParameter указывает на столбец базы данных varchar (или char), вы должны использовать DbType.AnsiString. Когда вы указываете на столбец nvarchar, используйте DbType.String, потому что его Unicode.

Более длинный ответ: Если они не отображаются точно (например, указав DbType.String на столбец varchar(nn), вы увидите CONVERT_IMPLICIT предупреждений в ваших планах запросов, как описано Пиналом Дейвом здесь: https://blog.sqlauthority.com/2018/06/11/sql-server-how-to-fix-convert_implicit-warnings/

В моем случае свойство SqlParameter.Size также казалось важным: для полного устранения CONVERT_IMPLICIT предупреждений мне пришлось правильно сопоставить DbType и Size. Значение по умолчанию Size, если оно опущено, «выводится из фактического размера указанного значения параметра» (1), что обычно не соответствует определению реального размера столбца и также вызывает предупреждение.

  1. https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlparameter.size?view=netframework-4.7.2
...