2010-01-06 76 views
6

我想使用FileHelpers加載文件(就像它已經除了這一個問題:P) 我必須將CSV文件數據保存到數據庫,所以我使用SqlDecimal數據類型來存儲CSV文件的十進制值。如何在FileHelper類中處理SQLDecimal數據類型的空值

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

所有這些工作正常,直到我有一個空白的FixRate1值。這被標記爲一個錯誤。

「警告異常:空值發現 在類 ‘SWTrade’你必須指定一個 FieldNullValueAttribute因爲這 是值類型和不可阻擋的爲空場‘費率’。」

我試着把[FileHelpers.FieldNullValue(SqlDecimal.Null)],但它顯然會引發錯誤。

的屬性參數必須是 常量表達式的typeof一個 屬性參數類型

的表達 或數組創建表達式即使我重寫FieldToString方法在SqlDecimalConverter類,讀取數據時不調用該函數。

那麼,有沒有一種方法可以將任何空值或甚至一些其他硬編碼值賦給Rate數據,然後我可以用我自己的邏輯中的null direclty替換它?

請讓我知道你是否需要更多的細節。 在此先感謝。

回答

2

我從來沒有與FileHelpers的工作,但你可以嘗試,而不是:

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

除了你的其他屬性,當然。

請注意這裏的重大變化 - 我給SqlDecimal添加了一個問號,使其成爲nullable type

然後你可以使用Rate.HasValue瑟無論是空或不和Rate.Value訪問SqlDecimal如果HasValue是真實的。

像這樣的東西會正確使用SqlDecimal.Null您解析該文件後:

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

編輯 - 如果你讓房價可空(SqlDecimal?),你甚至都不需要「FieldNullValue」屬性有可能。再次,我不熟悉圖書館。 :(

+0

不,他提到他試過SqlDecimal.Null這不是一個常量表達式。 – Sapph 2010-01-06 05:53:47

+0

@Sapph:對不起,我的壞 - 我沒有仔細閱讀這個問題(和你的回答)。 – 2010-01-06 06:06:07

3

你可以嘗試使用Nullable類型,如果你使用Nullable類型,那麼你不需要指定FieldNullValue屬性。

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

該方法適用於使用FileHelpers內置類型轉換器的DateTime。

如果這樣做不起作用,那麼您可以指定一個默認值,您可以將其視爲null。但是,這可能是有問題的,如果有對應於所選擇的默認值實際值:

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

更新

我只是做了一個測試,只需使用十進制?類型工作正常。然後,您可以將其轉換爲適當的SqlType來訪問數據庫。我認爲這是最簡單的方法。

等等領域只是看起來像:

public decimal? Rate; 

不需要的屬性。

+0

[FieldNullValue(typeof運算(SQLDECIMAL),「01/01/0001」) 你不覺得它會本身產生一個錯誤嘗試的可能日期時間值轉換爲SQLDECIMAL類型是什麼時候? – keepsmilinyaar 2010-01-06 07:58:43

+0

糟糕。 :)謝謝 - 這是從DateTime測試中遺留下來的。更改爲-1。 – 2010-01-06 08:11:46

+0

{「從'System.String'轉換爲'System.Data.SqlTypes.SqlDecimal'。」} 是我在放入您提到的行時得到的結果。 [FieldNullValue(typeof(SqlDecimal),「-1」)] 任何其他的想法? – keepsmilinyaar 2010-01-06 08:37:16

0

爲什麼你不能使用Decimal或適當的.NET數據類型,而不是SqlDecimal
我建議您改爲將代碼更改爲public Decimal? Rate;

+0

不太確定FileHelpers是如何工作的。可能需要嘗試並查看源代碼。我實際上想要將整個csv文件轉換爲數據表,以便我可以使用SQLBulkCopy來保存數據。 但我得到以下錯誤,使用可空類型 當「數據集不支持System.Nullable <>」 此外,在調用「fileHelperEngine.ReadFileAsDT()」的重寫方法FieldToString()不會被觸發。 – keepsmilinyaar 2010-01-11 05:45:27

7

的其他意見是正確的ü需要使用

private decimal? internalRate; 

後來又創建屬性的轉換,其實庫只autoconverts原生類型和SQLDECIMAL是一個也沒有。

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

PS:如果妳想要去定製轉換器的方式,用它來讀取U需要重寫方法StringToFieldFieldToString被稱爲寫入)

希望這有助於:)

+0

令人驚訝的是,FieldToString函數未被調用,文件幫助器直接拋出異常。 – keepsmilinyaar 2010-01-11 05:50:54

+0

U正在返回一個SqlDecimal值? 你可以給我轉換器的代碼或粘貼在這裏檢查什麼是錯的?謝謝 – MarcosMeli 2010-01-11 11:41:14

相關問題