Можно ли использовать AnsiStrings по умолчанию с помощью Dapper?

Я использую Dapper для базы данных, где строки хранятся в основном в столбцах VarChar. По умолчанию Dapper использует NVarChar параметры при генерации запросов, и, хотя я могу обернуть каждый строковый параметр, который я использую с DbString, было бы здорово использовать AnsiStrings по умолчанию и использовать DbString для случая NVarChar.

Я попытался изменить карту типа в источнике Dapper с DbType.String до DbType.AnsiString, однако это, по-видимому, вызывает ошибку в гене генерации для делегата параметров (выбрасывает InvalidProgramException).

Есть ли более простой способ сделать это?

Обновление

Просто изменить типMap было недостаточно, мне нужно было изменить некоторые проверки if (dbType == DbType.String). Теперь он работает!

Ответы

Ответ 1

Вы можете выполнить это без изменения исходного кода.

Dapper.SqlMapper.AddTypeMap(typeof(string), System.Data.DbType.AnsiString);

Настройка этого параметра однажды настроит все ваши строки на varchar.

Ответ 2

Чтобы использовать ansistrings по умолчанию, мне пришлось (ссылаясь на источник Dapper 1.3 от NuGet):

  • Измените карту типов, чтобы использовать DbType.AnsiString на L164 вместо DbType.String
  • В методе CreateParamInfoGenerator измените проверки на L960, L968, L973, чтобы включить DbType.AnsiString, а также DbType.String.

Проблема с недействительным ИЛ, казалось, заключалась в том, что более поздняя ветвь кода на L1000 проверяет на typeof(string), тогда как предыдущие ветки используют DbType.

Делаем все снова персиковым - больше не сканирует индекс!

Ответ 3

Для даты и времени данных с учетом часового пояса.

SqlMapper.AddTypeMap(typeof(DateTime), System.Data.DbType.DateTimeOffset);

Диапазон значений дат - с 1 января 2009 года по 31 декабря 9999 года нашей эры. Диапазон значений времени - от 00:00:00 до 23: 59: 59.9999999 с точностью до 100 наносекунд. Диапазон значений часового пояса составляет от -14: 00 до +14: 00.