我正在尝试使用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替换它?
如果您需要更多详细信息,请告诉我们。 提前致谢。
答案 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;
。