Dapper i varchars

Znalazłem następujący komentarzstrona główna projektu Dapper .NET.

Dapper obsługuje parametry varchar, jeśli wykonujesz klauzulę where w kolumnie varchar używając param, upewnij się, że przekazujesz ją w ten sposób:

    Query<Thing>("select * from Thing where Name = @Name", new {Name = 
    new DbString { Value = "abcde", IsFixedLength = true, Length = 10, IsAnsi = true });

Na serwerze Sql bardzo ważne jest użycie unicode podczas wysyłania zapytań do unicode i ansi podczas kwerendy niebędącej Unicode

Oceniam Dappera do użycia ze starszą bazą danych (SQL Server 2008), z wieloma procedurami składowanymi z parametrami varchar, i jestem trochę zdezorientowany tym ograniczeniem.

Używając ręcznie utworzonego kodu ADO.NET, użyłbym następującego dla powyższego zapytania:

new SqlParameter("@Name", "abcde")

bez określania, czy jest to Unicode, czy nie, ani długość.

Dlaczego potrzebuję tej szczegółowej składni DbString z Dapper, określając długość kolumny, IsFixedLength i IsAnsi?

Dlaczego IsFixedLength = true dla kolumny varchar (spodziewam się, że będzie ona prawdziwa dla kolumny char lub nchar)?

Czy muszę używać DbString w ten sposób dla parametrów procedury składowanej?

Spodziewałem się, że Dapper sprawi, że mój kod DAL będzie bardziej zwięzły, ale wydaje się, że czyni to bardziej gadatliwym dla parametrów varchar.

AKTUALIZACJA

Zbadałem trochę dalej, aby spróbować zrozumieć, dlaczego Dapper miałby to ograniczenie varchar, które nie wydaje mi się mieć w moim ręcznie tworzonym kodzie, gdzie normalnie tworzyłbym parametr wejściowy w następujący sposób:

var parameter = factory.CreateParameter(); // Factory is a DbProviderFactory
parameter.Name = ...;
parameter.Value = ...;

i zazwyczaj zostawiają dostawcę, aby wywnioskowaćDbType używając własnych reguł, chyba że chcę go wymusić.

Patrząc na DapperaDynamicParameters klasa, ma metodęAddParameters który tworzy parametry w następujący sposób:

var dbType = param.DbType; // Get dbType and value
var val = param.Value;     // from 

...
// Coerce dbType to a non-null value if val is not null !!!!!
if (dbType == null && val != null) dbType = SqlMapper.LookupDbType(val.GetType(),name);
...
var p = command.CreateParameter();
...
if (dbType != null)                     
{                         
    p.DbType = dbType.Value;                     
}

To znaczy. wyraźnie wymuszaIDataParameter.DbType do wartości wyszukuje za pomocą własnego algorytmu, zamiast opuszczać dostawcę do używania własnych reguł.

Czy jest ku temu dobry powód? Wydaje mi się to niewłaściwe, szczególnie w świetle komentarza na temat wsparcia Dappera dla parametrów varchar.

questionAnswers(2)

yourAnswerToTheQuestion