6

FileHelpers を使用してファイルをロードしようとしています (この 1 つの問題を除いて既に同様です:P) CSV ファイル データをデータベースに保存する必要があるため、SqlDecimal データ型を使用して CSV ファイルの 10 進数値を格納しています。

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

FixRate1 の値が空白になるまで、これはすべて正常に機能します。これはエラーでフラグが立てられます。

「警告例外: クラス 'SWTrade' のフィールド 'Rate' に Null 値が見つかりました。これは ValueType であり、null にすることはできないため、FieldNullValueAttribute を指定する必要があります。」

[FileHelpers.FieldNullValue(SqlDecimal.Null)] を入れてみましたが、明らかにエラーがスローされます。

属性引数は、定数式、typeof 式、または属性パラメーター タイプの配列作成式でなければなりません

SqlDecimalConverterクラスのFieldToStringメソッドをオーバーライドしても、データの読み取り時に関数は呼び出されません。

さて、これが事実である場合、Null値またはその他のハードコードされた値をRateデータに割り当てて、独自のロジックでnull直接に置き換える方法はありますか?

詳細が必要な場合はお知らせください。前もって感謝します。

4

4 に答える 4

7

他のコメントは正しく、使用する必要があります

private decimal? internalRate;

後で変換用のプロパティを作成します。実際、ライブラリはネイティブ型のみを自動変換し、SqlDecimal は 1 つではありません。

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

PS:カスタムコンバーターの方法に行きたい場合は、それを読み取りに使用するには、メソッド StringToField をオーバーライドする必要があります FieldToString書き込みのために呼び出されます)

お役に立てれば :)

于 2010-01-06T13:40:49.307 に答える
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;

属性は必要ありません。

于 2010-01-06T07:45:06.103 に答える
2

私はFileHelpersを使ったことがありませんが、代わりに試すことができます。

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

もちろん、他の属性に加えて。

ここでの大きな変更に注意してください-null許容型SqlDecimalにするために疑問符を追加しました。

次に、それを使用Rate.HasValueしてnullかどうかを確認し、iftrueRate.ValueにアクセスできSqlDecimalますHasValue

SqlDecimal.Nullこのようなものは、ファイルを解析した後に適切に使用されます。

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

編集-Rateをnull許容(SqlDecimal?)にすると、「FieldNullValue」属性も必要なくなる可能性があります。繰り返しますが、私は図書館に精通していません。:(

于 2010-01-06T05:50:47.277 に答える