Znalazłem następujący komentarz na temat the Dapper .NET project home page.Daper i varchary
Dapper supports varchar params, if you are executing a where clause on a varchar column using a param be sure to pass it in this way:
Query<Thing>("select * from Thing where Name = @Name", new {Name =
new DbString { Value = "abcde", IsFixedLength = true, Length = 10, IsAnsi = true });
On Sql Server it is crucial to use the unicode when querying unicode and ansi when querying non unicode
Jestem oceny Dapper do pracy z bazą danych SQL Server starszych (2008), z dużą ilością procedur składowanych z parametrami varchar i jestem trochę zdezorientowany przez to ograniczenie.
Z rzemieślnicza kodu ADO.NET, będę używać następujących dla powyższego zapytania:
new SqlParameter("@Name", "abcde")
bez określania, czy to Unicode, czy nie, ani długość.
Dlaczego muszę ten rozwlekły DbString składni z Dapper, określając długość kolumny, IsFixedLength i IsAnsi?
Dlaczego IsFixedLength = true dla kolumny varchar (spodziewam się, że jest to prawda dla kolumny char lub nchar)?
Czy muszę używać DbString w ten sposób do 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 jest on bardziej szczegółowy dla parametrów varchar.
UPDATE
mam zbadane kawałek dalej, aby spróbować zrozumieć, dlaczego Wytworny miałoby to ograniczenie varchar, które nie wydają się mieć w ręku spreparowanego kodu, gdzie normalnie utworzyć parametr wejściowy następująco:
var parameter = factory.CreateParameter(); // Factory is a DbProviderFactory
parameter.Name = ...;
parameter.Value = ...;
i zwykle opuszczają dostawcę do wnioskowania o DbType
wykorzystując swoje własne zasady, chyba że specjalnie chce go zmusić.
Patrząc na DynamicParameters
klasy Dapper za to ma metodę AddParameters
która tworzy następujące parametry:
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;
}
Tj jawnie wymusza na wartości, którą wyszukuje za pomocą własnego algorytmu, wartość IDataParameter.DbType
, zamiast pozostawić dostawcę do korzystania z własnych reguł.
Czy istnieje ku temu dobry powód? Wydaje mi się to niewłaściwe, szczególnie w świetle komentarza dotyczącego wsparcia Dappera dla parametrów varchar.
Witamy w Stack Overflow! Odpowiedzi tylko na kod nie są bardzo przydatne same. Pomogłoby to w dodaniu szczegółów wyjaśniających, jak/dlaczego odpowiada na pytanie. – SiHa
Jest nieco niejasne pytanie, ale powinno być wystarczającym wskazaniem dla innych, jak korzystać z varcharów i procedur przechowywanych. – dbol