2014-05-16 15 views
6

Sto verificando la v1.25 di Dapper con Sqlite tramite System.Data.Sqlite. Se corro questa query:Conversione intero Dapper e verso il basso

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

ottengo il seguente errore: System.InvalidCastException: Specified cast is not valid

Questo perché Sqlite restituisce il valore di cui sopra come un Int64, che posso verificare con il seguente codice. Questo getterà "Int64":

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

Ora, il seguente codice sarà effettivamente gestire la conversione verso il basso da Int64 a 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()); 

Quando mi passi questa eccezione, mi dà il conteggio effettivo fila , indicando che Dapper ha gestito la conversione per me.

La mia domanda è, perché è che dbc.Query<int> non gestisce la conversione verso il basso in modo simile a dbc.Query<QuerySummary>? È questo comportamento previsto?

risposta

4

No, non è intenzionale. Ho eseguito il commit e inviato le modifiche a github che effettuano il seguente passaggio (non riesce su 1,25); dovrebbe apparire anche su NuGet a un certo punto:

// 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, molte grazie per aver parlato così rapidamente. Ho controllato NuGet ma non sembra che sia ancora disponibile. Lo prenderò di Github più tardi oggi se avrò tempo per provarlo. Inoltre, sono felice di segnalare che un problema relativo alla conversione da Int64 a Int32 nullable esistente in 1.13 è andato in 1,25. Grandi cose. – John

+0

Solo un breve resoconto, ho scaricato la build più recente da Github e l'ho testata in un paio di scenari con cui ho lavorato. Ha funzionato perfettamente, senza eccezioni. Grazie ancora. – John

+0

@John bene a sentire, grazie –

Problemi correlati