2013-10-14 6 views
10

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.

Odpowiedz

-1
var param = new { Varchar1 = "", Varchar2 = "" }; 
db.Query("SP", param, commandType:CommandType.StoredProcedure); 
+0

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

+0

Jest nieco niejasne pytanie, ale powinno być wystarczającym wskazaniem dla innych, jak korzystać z varcharów i procedur przechowywanych. – dbol

0

Ta składnia jest potrzebna podczas pracy z ODBC.

Musisz zdefiniować pole CHAR (30) jako DbString w C# dla Dappera, a także ustawić wartości length (30) i ansi (true), aby uniemożliwić Dapperowi założenie, że łańcuch był tekstem/typem blob. W przeciwnym razie prawdopodobnie pojawi się błąd: "Nielegalna próba konwersji typu blobu typu tekst/bajt".

Otrzymałem ten błąd za pomocą ODBC, aby połączyć się z Informix, dopóki nie zdefiniowałem mojego parametru jako DbString() i ustaw długość i wartości ansi.

More info here.