2010-01-06 11 views
6

Sto provando a caricare un file utilizzando FileHelpers (come già ad eccezione di questo problema: P) Devo salvare i dati del file CSV nel database, e così sono utilizzando un tipo di dati SqlDecimal per memorizzare i valori decimali dei file CSV.come gestire valori null per il tipo di dati SQLDecimal nelle classi FileHelper

[FileHelpers.FieldOptional()] 
[FileHelpers.FieldConverter(typeof(SqlDecimalConverter))] 
public SqlDecimal Rate; 

Tutto ciò funziona correttamente, finché non ho un valore vuoto per FixRate1. Questo è segnalato con un errore.

"Avvisa Eccezione: nullo valore trovato per il campo 'Tasso' nella classe 'SWTrade' Devi specificare un FieldNullValueAttribute perché questo è un ValueType e ostacolo ci sia nulla.".

Ho provato a mettere [FileHelpers.FieldNullValue (SqlDecimal.Null)], ma getta ovviamente un errore.

Un argomento attributo deve essere una costante espressione , typeof espressione o creazione matrice espressione di un parametro di attributo tipo

Anche se sovrascrivo metodo FieldToString nel SqlDecimalConverter classe , la funzione non viene chiamata, durante la lettura dei dati.

Bene, questo è il caso, c'è un modo per assegnare qualsiasi valore nullo o anche qualche altro valore codificato ai dati Rate, che posso quindi sostituire con un comando nullo nella mia logica?

Per favore fatemi sapere se avete bisogno di maggiori dettagli. Grazie in anticipo.

risposta

2

Non ho mai lavorato con FileHelpers, ma si potrebbe provare invece:

[FileHelpers.FieldNullValue(null)] 
public SqlDecimal? Rate; 

Oltre ai suoi altri attributi, naturalmente.

Nota il grande cambiamento qui - Ho aggiunto un punto interrogativo a SqlDecimal per renderlo un nullable type.

Quindi è possibile utilizzare Rate.HasValue per sé se è null o non e Rate.Value per accedere al SqlDecimal se HasValue è vero.

Qualcosa di simile utilizzerà correttamente SqlDecimal.Null dopo si analizza il file:

SqlDecimal trueRate = (Rate.HasValue ? Rate.Value : SqlDecimal.Null); 

Edit - E 'possibile che se si fanno Vota annullabile (SqlDecimal?) non è nemmeno necessario l'attributo "FieldNullValue". Ancora una volta, non ho familiarità con la biblioteca. :(

+0

No, ha ricordato cercava SqlDecimal.Null che non è un'espressione costante. – Sapph

+0

@Sapph: mi dispiace, mio ​​male - Non ho letto abbastanza attentamente la domanda (e la tua risposta). –

3

Si potrebbe provare a utilizzare un tipo Nullable.Se si utilizza un tipo Nullable, non è necessario specificare l'attributo FieldNullValue.

[FileHelpers.FieldConverter(typeof(SqlDecimalConverter))] 
public SqlDecimal? Rate; 

Questo approccio funziona bene con DateTime utilizzando il convertitore di tipi integrato FileHelpers.

Se questo non dovesse funzionare allora si potrebbe assegnare un valore di default che si potrebbe trattare come un nulla. Ma che può essere problematico se non v'è un valore reale che corrisponde al valore di default scelto:

[FieldNullValue(typeof(SqlDecimal), "-1")] 
[FileHelpers.FieldConverter(typeof(SqlDecimalConverter))] 
public SqlDecimal Rate; 

Aggiornamento

Ho appena fatto una prova e semplicemente utilizzando un decimale? tipo funziona bene. Quindi è possibile convertirlo nel codice per l'appropriato SqlType per accedere al database. Penso che sia l'approccio più semplice.

Così il campo sarebbe solo apparire come:

public decimal? Rate; 

senza attributi richiesti.

+0

[FieldNullValue (typeof (SqlDecimal), "01/01/0001")] Non si pensa che genererebbe un errore in sé quando si cerca di convertire un possibile valore datetime ad un tipo SqlDecimal? – keepsmilinyaar

+0

Oops. :) Grazie - questo è rimasto da un test DateTime. Modificato a -1. –

+0

{ "ghisa non valida dal 'System.String' a 'System.Data.SqlTypes.SqlDecimal'."} è ciò che ottengo quando ho messo nella linea citato da voi. [FieldNullValue (typeof (SqlDecimal), "-1")] Altre idee ??? – keepsmilinyaar

0

Perché non è possibile utilizzare Decimal o un tipo di dati .net appropriato anziché SqlDecimal?
Sto suggerendo di cambiare il codice in public Decimal? Rate;.

+0

Non sei sicuro di come funzioni FileHelpers. Probabilmente dovrà provare e dare un'occhiata al codice sorgente. In realtà voglio convertire l'intero file CSV in un datatable in modo da poter SQLBulkCopy per mantenere i dati. ma ottengo il seguente errore, quando si utilizza tipi nullable "DataSet non supporta System.Nullable <>" Inoltre, al momento di chiamare "fileHelperEngine.ReadFileAsDT()" Il metodo di sostituzione FieldToString() non ha effetto. – keepsmilinyaar

7

Gli altri commenti hanno ragione e necessità di utilizzare

private decimal? internalRate; 

E più tardi creare una proprietà per la conversione, infatti biblioteca autoconverts solo tipi nativi e SqlDecimal non è uno.

public SqlDecimal? Rate 
{ 
    get 
    { 
     if (internalRate.HasValue) 
      return new SqlDecimal(internalRate.Value); 
     else 
      return null; 
    } 
} 

PS: Se volete andare al modo convertitore personalizzato, da utilizzare in lettura u bisogno di sovrascrivere il metodo StringToField (FieldToString viene chiamato per la scrittura)

Spero che questo aiuti :)

+0

Sorprendentemente, la funzione FieldToString non viene chiamata e l'helper del file genera direttamente un'eccezione. – keepsmilinyaar

+0

U restituisce un valore SqlDecimal? Potete inviarmi il codice del convertitore o incollarlo qui per verificare che cosa non va? Grazie – MarcosMeli

Problemi correlati