2014-05-16 15 views
6

Sprawdzam v1.25 z Dapper z Sqlite za pośrednictwem System.Data.Sqlite. Jeśli mogę uruchomić tej kwerendy:Konwersja Dapper i Downward Integer

var rowCount = dbc.Query<int>("SELECT COUNT(*) AS RowCount FROM Data").Single(); 

pojawia się następujący błąd: System.InvalidCastException: Specified cast is not valid

To dlatego Sqlite zwraca powyższą wartość jako Int64, które można zweryfikować za pomocą następującego kodu. To rzucać „Int64”:

var row = dbc.Query("SELECT COUNT(*) AS RowCount FROM Data").Single(); 
Type t = row.RowCount.GetType(); 
throw new System.Exception(t.FullName); 

Teraz poniższy kod będzie faktycznie obsługiwać konwersję w dół z Int64 do Int32:

public class QuerySummary 
{ 
    public int RecordCount { get; set; } 
} 
var qs = dbc.Query<QuerySummary>("SELECT COUNT(*) AS RecordCount FROM Data").Single(); 
rowCount = qs.RecordCount; 
throw new System.Exception(rowCount.ToString()); 

Kiedy rzucam ten wyjątek, to daje mi rzeczywistą liczbę wierszy , wskazując, że Dapper zajął się dla mnie nawróceniem.

Moje pytanie brzmi: dlaczego to dbc.Query<int> nie obsługuje konwersji w dół w sposób podobny do dbc.Query<QuerySummary>? Czy to zamierzone zachowanie?

Odpowiedz

4

Nie, to nie jest zamierzone działanie. Popełniłem i pchnąłem zmiany w github, które sprawiają, że następna passa (nie powiedzie się w dniu 1.25); powinien pojawić się również na NuGet w pewnym momencie:

// http://stackoverflow.com/q/23696254/23354 
    public void DownwardIntegerConversion() 
    { 
     const string sql = "select cast(42 as bigint) as Value"; 
     int i = connection.Query<HasInt32>(sql).Single().Value; 
     Assert.IsEqualTo(42, i); 

     i = connection.Query<int>(sql).Single(); 
     Assert.IsEqualTo(42, i); 
    } 
+0

Marc, wielkie dzięki za tak szybkie rozpatrzenie. Sprawdziłem NuGet, ale nie wygląda na to, że jest jeszcze dostępny. Wezmę to później z Githuba, jeśli znajdę trochę czasu, żeby to przetestować. Ponadto, z przyjemnością informuję, że problem z konwersją wartości pustej Int64 na Int32 istniejącej w wersji 1.13 zniknął w wersji 1.25. Świetna sprawa. – John

+0

Po krótkim raporcie pobrałem najnowszą kompilację z Github i przetestowałem ją w kilku scenariuszach, z którymi współpracowałem. Działało idealnie, żadnych wyjątków. Dzięki jeszcze raz. – John

+0

@John dobrze słyszeć, dzięki –