6

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

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

所有这一切都很好,直到我有一个 FixRate1 的空白值。这被标记为错误。

“警告异常:在类 'SWTrade' 中为字段 'Rate' 找到空值。您必须指定 FieldNullValueAttribute,因为这是一个 ValueType,不能为空。”

我尝试放置 [FileHelpers.FieldNullValue(SqlDecimal.Null)] 但它显然会引发错误。

属性参数必须是属性参数类型的常量表达式、typeof 表达式或数组创建表达式

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

那么,在这种情况下,有没有一种方法可以将任何空值甚至其他硬编码值分配给速率数据,然后我可以在自己的逻辑中将其替换为空值?

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

4

4 回答 4

7

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

private decimal? internalRate;

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

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

PS:如果你想去自定义转换器的方式,用它来读取你需要重写方法StringToFieldFieldToString被称为写入)

希望这可以帮助 :)

于 2010-01-06T13:40:49.307 回答
3

您可以尝试使用 Nullable 类型。如果您使用的是 Nullable 类型,则无需指定 FieldNullValue 属性。

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

使用内置类型转换器的 FileHelpers,该方法适用于 DateTime。

如果这不起作用,那么您可以分配一个默认值,您可以将其视为空值。但是,如果存在与所选默认值相对应的实际值,则可能会出现问题:

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

更新

我刚刚做了一个测试,只是使用了一个小数?类型工作正常。然后,您可以在代码中将其转换为正确的 SqlType 以访问数据库。我认为这是最简单的方法。

所以该字段看起来像:

public decimal? Rate;

不需要属性。

于 2010-01-06T07:45:06.103 回答
2

我从未使用过 FileHelpers,但您可以尝试:

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

当然,除了你的其他属性。

请注意这里的重大变化 - 我添加了一个问号以SqlDecimal使其成为可为空的类型

然后您可以使用Rate.HasValue它来判断它是否为空并Rate.Value访问SqlDecimal如果HasValue为真。

SqlDecimal.Null解析文件后,这样的东西会正确使用:

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

编辑 - 如果您将 Rate 设为 nullable ( SqlDecimal?),您甚至可能不需要“FieldNullValue”属性。同样,我对图书馆不熟悉。:(

于 2010-01-06T05:50:47.277 回答
0

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

于 2010-01-06T09:10:54.870 回答