2010-01-06 5 views
6

behandeln Ich versuche, eine Datei mit FileHelpers (wie es bereits außer diesem einen Problem zu laden: P) Ich muss CSV-Datei Daten in die Datenbank speichern, und so bin Verwenden eines SqlDecimal-Datentyps zum Speichern der Dezimalwerte der CSV-Dateien.wie NULL-Werte für SQLDecimal-Datentyp in FileHelper-Klassen

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

All dies funktioniert gut, bis ich einen leeren Wert für das FixRate1 habe. Dies ist mit einem Fehler gekennzeichnet.

„Warnen Ausnahme: Nullwert für fand das Feld‚Rate‘in der Klasse ‚SWTrade‘Sie müssen einen FieldNullValueAttribute angeben, da diese ein Valuetype ist und kann nicht null sein..“

Ich habe versucht, [FileHelpers.FieldNullValue (SqlDecimal.Null)], aber es wirft offensichtlich einen Fehler.

muss ein Attribut Argument eine konstanter Ausdruck, Typeof oder Array-Erstellung Ausdruck sein Expression eines Attributparametertyp

obwohl ich die FieldToString Methode in der Klasse SqlDecimalConverter überschreiben , die Funktion wird beim Lesen der Daten nicht aufgerufen.

Nun, ist das der Fall, gibt es eine Möglichkeit, den Rate-Daten einen Nullwert oder sogar einen anderen fest codierten Wert zuzuweisen, den ich dann durch eine Null-Direktive in meiner eigenen Logik ersetzen kann?

Bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen würden. Vielen Dank im Voraus.

Antwort

2

Ich habe noch nie mit FileHelpers gearbeitet, aber man könnte versuchen, stattdessen:

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

Zusätzlich zu Ihren anderen Attributen, natürlich.

Beachten Sie die große Änderung hier - Ich habe SqlDecimal ein Fragezeichen hinzugefügt, um es zu nullable type zu machen.

Dann können Sie Rate.HasValue zu se verwenden, ob es null ist oder nicht, und Rate.Value Zugriff auf die SqlDecimal wenn HasValue wahr ist.

So etwas wird richtig SqlDecimal.Null verwenden, nachdem Sie die Datei analysieren:

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

Bearbeiten - Es ist möglich, dass, wenn Sie Rate nullable (SqlDecimal?) können Sie den „FieldNullValue“ -Attribut brauchen noch nicht einmal machen. Auch hier bin ich mit der Bibliothek nicht vertraut. :(

+0

Nein, er erwähnte, dass er versucht SqlDecimal.Null, das ist kein konstanter Ausdruck. – Sapph

+0

@Sapph: Entschuldigung, mein Schlechter - ich habe die Frage (und deine Antwort) nicht sorgfältig genug gelesen. –

3

Sie könnten versuchen, einen Nullable-Typ zu verwenden. Wenn Sie einen Nullable-Typ verwenden, müssen Sie das FieldNullValue-Attribut nicht angeben.

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

Dieser Ansatz funktioniert gut mit DateTime unter Verwendung der FileHelpers Typ Converter.

Wenn das nicht funktioniert, können Sie einen Standardwert zuweisen, den Sie als null behandeln könnten. Aber das kann problematisch sein, wenn es einen tatsächlichen Wert ist, der dem gewählten Standardwert entspricht:

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

aktualisieren

Ich habe nur ein Test und einfach eine Dezimalzahl verwenden? Typ funktioniert gut. Dann können Sie es in Ihrem Code in den richtigen SqlType konvertieren, um auf die Datenbank zuzugreifen. Ich denke, das ist der einfachste Ansatz.

So würde das Feld aussehen wie:

public decimal? Rate; 

keine erforderlichen Attribute.

+0

[FieldNullValue (typeof (SqlDecimal), "01/01/0001"]] Denken Sie nicht, dass es bei dem Versuch, einen möglichen Datetime-Wert in einen SQLDecimal-Typ zu konvertieren, einen Fehler in sich selbst erzeugen würde? – keepsmilinyaar

+0

Hoppla. :) Danke - das ist ein Rest von einem DateTime-Test. In -1 geändert. –

+0

{"Ungültige Umwandlung von 'System.String' nach 'System.Data.SqlTypes.SqlDecimal'."} ist was ich bekomme, wenn ich die von Ihnen erwähnte Zeile einfüge. [FieldNullValue (typeof (SqlDecimal), "-1")] Irgendwelche anderen Ideen ??? – keepsmilinyaar

0

Warum können Sie nicht Decimal oder einen geeigneten .net-Datentyp anstelle von SqlDecimal verwenden?
Ich schlage vor, dass Sie den Code stattdessen zu public Decimal? Rate; ändern sollten.

+0

Nicht ganz sicher, wie FileHelpers arbeiten. Werde wahrscheinlich versuchen den Quellcode anzuschauen. Ich möchte tatsächlich die gesamte CSV-Datei in eine Datentabelle konvertieren, damit ich SQLBulkCopy die Daten beibehalten kann. Aber ich bekomme die folgende Fehlermeldung, wenn Nullable Types mit Auch beim Aufruf „fileHelperEngine.ReadFileAsDT()“ die Überbrückungs Methode FieldToString() wird nicht ausgelöst „DataSet nicht System.Nullable <> unterstützen“. – keepsmilinyaar

7

Die anderen Kommentare sind rechts u

private decimal? internalRate; 

Und später schaffen eine Eigenschaft für die Umwandlung in der Tat nur die Bibliothek autoconverts native Typen und SqlDecimal ist nicht ein verwenden müssen.

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

PS: Wenn u der benutzerdefinierten Konverter Weg gehen wollen, es bis zum Lesen verwenden müssen, u die Methode StringToField (FieldToString zum Schreiben genannt wird) außer Kraft zu setzen

this helps :)

+0

Überraschenderweise wird die FieldToString-Funktion nicht aufgerufen, und der Dateihelfer löst direkt eine Ausnahme aus. – keepsmilinyaar

+0

U geben einen SqlDecimal-Wert zurück? Kannst du mir den Code des Konverters schicken oder ihn hier einfügen, um zu überprüfen, was falsch ist? Vielen Dank – MarcosMeli