Ответ 1
Вы можете выполнить это без изменения исходного кода.
Dapper.SqlMapper.AddTypeMap(typeof(string), System.Data.DbType.AnsiString);
Настройка этого параметра однажды настроит все ваши строки на varchar.
Я использую Dapper для базы данных, где строки хранятся в основном в столбцах VarChar
. По умолчанию Dapper использует NVarChar
параметры при генерации запросов, и, хотя я могу обернуть каждый строковый параметр, который я использую с DbString
, было бы здорово использовать AnsiStrings по умолчанию и использовать DbString
для случая NVarChar
.
Я попытался изменить карту типа в источнике Dapper с DbType.String
до DbType.AnsiString
, однако это, по-видимому, вызывает ошибку в гене генерации для делегата параметров (выбрасывает InvalidProgramException
).
Есть ли более простой способ сделать это?
Обновление
Просто изменить типMap было недостаточно, мне нужно было изменить некоторые проверки if (dbType == DbType.String)
. Теперь он работает!
Вы можете выполнить это без изменения исходного кода.
Dapper.SqlMapper.AddTypeMap(typeof(string), System.Data.DbType.AnsiString);
Настройка этого параметра однажды настроит все ваши строки на varchar.
Чтобы использовать ansistrings по умолчанию, мне пришлось (ссылаясь на источник Dapper 1.3 от NuGet):
DbType.AnsiString
на L164 вместо DbType.String
CreateParamInfoGenerator
измените проверки на L960, L968, L973, чтобы включить DbType.AnsiString
, а также DbType.String
.Проблема с недействительным ИЛ, казалось, заключалась в том, что более поздняя ветвь кода на L1000 проверяет на typeof(string)
, тогда как предыдущие ветки используют DbType
.
Делаем все снова персиковым - больше не сканирует индекс!
Для даты и времени данных с учетом часового пояса.
SqlMapper.AddTypeMap(typeof(DateTime), System.Data.DbType.DateTimeOffset);
Диапазон значений дат - с 1 января 2009 года по 31 декабря 9999 года нашей эры. Диапазон значений времени - от 00:00:00 до 23: 59: 59.9999999 с точностью до 100 наносекунд. Диапазон значений часового пояса составляет от -14: 00 до +14: 00.