2010-01-06 64 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

相关问题