如何在FileHelper类中处理SQLDecimal数据类型的空值

时间:2010-01-06 05:37:02

标签: c# types filehelpers

我正在尝试使用FileHelpers加载文件(除了这个问题之外已经像它一样:P) 我必须将CSV文件数据保存到数据库中,因此使用SqlDecimal数据类型来存储CSV文件的十进制值。

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

所有这一切都正常,直到我有一个FixRate1的空值。这标记为错误。

  

“警告异常:找到空值   班级中的“费率”字段   'SWTrade'。你必须指定一个   FieldNullValueAttribute因为这个   是一个ValueType,不能为空。“

我尝试了[FileHelpers.FieldNullValue(SqlDecimal.Null)],但它显然会抛出错误。

  

属性参数必须是a   常量表达式,表达式   或者数组创建表达式   属性参数类型

即使我覆盖 SqlDecimalConverter 类中的 FieldToString 方法,在读取数据时也不会调用该函数。

嗯,在这种情况下,有没有办法可以为Rate数据分配任何空值或甚至其他一些硬编码值,然后我可以用我自己的逻辑中的null direclty替换它?

如果您需要更多详细信息,请告诉我们。 提前致谢。

4 个答案:

答案 0 :(得分:7)

其他评论是正确的,您需要使用

private decimal? internalRate;

后来为转换创建了一个属性,实际上该库只自动转换本机类型而SqlDecimal不是一个。

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

PS:如果你想转到自定义转换器方式,要使用它来读取你需要覆盖方法 StringToField FieldToString 被调用用于写入)< / p>

希望这会有所帮助:)

答案 1 :(得分: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;

无需属性。

答案 2 :(得分: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);

编辑 - 如果你使Rate nullable(SqlDecimal?)可能你甚至不需要“FieldNullValue”属性。我再也不熟悉图书馆了。 :(

答案 3 :(得分:0)

为什么不能使用Decimal或适当的.net数据类型而不是SqlDecimal
我建议您将代码更改为public Decimal? Rate;