2014-07-07 5 views
5

Sto provando a usare Dapper per la prima volta, ma ho subito incontrato il problema in quanto non sembra che Dapper sia in grado di gestire campi nullable. Questo mi sorprende molto poiché questi sono estremamente comuni.Può Dapper gestire campi booleani/bit nullable? [NON VALIDO]

Se ho un campo booleano nullable nel mio database SQL Server e cercare di utilizzare Dapper per popolare la proprietà booleana annullabile sulla mia classe C#, viene generata un'eccezione se il campo booleano contiene un valore nullo:

System.FormatException: String was not recognized as a valid Boolean. 

C'è qualche soluzione o soluzione per questo? Trovo difficile credere che Dapper non riesca a gestirlo perché sembra che sia in circolazione da un po 'e questa è una funzione estremamente semplice.

EDIT: Questo è stato un mio errore! La mia colonna era in realtà un nvarchar che conteneva 0 o 1, e come tale non l'avevo notato. Cambiarlo in BIT (o la proprietà C# in "stringa?") Risolve il problema.

+0

Puoi pubblicare la definizione della tabella e il codice Dapper che genera l'eccezione? –

+3

Il fatto che menzioni 'string' mi dice che il problema potrebbe essere il tuo dato/query ... qual è la colonna qui? –

+0

La colonna è in realtà il risultato di un SINISTRO SINISTRA e viene visualizzato come un DB null in SSIS. Forse questo non è riconosciuto come bool di Dapper? – NickG

risposta

7

Sì, funziona bene:

public void SO24607639_NullableBools() 
{ 
    var obj = connection.Query<HazBools>(
     @"declare @vals table (A bit null, B bit null, C bit null); 
     insert @vals (A,B,C) values (1,0,null); 
     select * from @vals").Single(); 
    obj.IsNotNull(); 
    obj.A.Value.IsEqualTo(true); 
    obj.B.Value.IsEqualTo(false); 
    obj.C.IsNull(); 
} 
class HazBools 
{ 
    public bool? A { get; set; } 
    public bool? B { get; set; } 
    public bool? C { get; set; } 
} 
+1

Hai ragione Sono un idiota La mia colonna è stata mappata a un NVARCHAR e io in qualche modo non avevo notato come il mio codice precedente (non azzimato) gestiva questo OK in qualche modo ... dovrei forse cancellare questa domanda? – NickG

+0

@NickG interamente a voi –

+0

Lascerò qui nel caso in cui qualcun altro renda lo stesso stupido sbaglio :) – NickG

0

Dato Dapper non fa troppo l'impianto idraulico, il set di record provenienti dalla banca dati contiene una stringa, un affermato dall'errore. Prova a controllare il tipo di colonna e, quando è chiaro, puoi modificare la classe DTO di conseguenza, o lanciarla in qualche modo nella query.