16

重複の可能性:
データテーブルにnull値が含まれているかどうかを確認するための最良の方法

DBNullでDataTable-DataRow値をチェックする方法を知りたいです。

次のような行タイプからデータベースから情報をフェッチするDataRowがあります。

varchar、money、Intなど。

そのような状況に対処するための私の(シンプルで甘い)アプローチはどうあるべきか。

4

4 に答える 4

26

試す:

foreach(DataRow row in table.Rows)
{
    object value = row["ColumnName"];
    if (value == DBNull.Value)
    {

    }
    else
    {
    }
}
于 2012-09-20T07:38:10.023 に答える
6

これを試して

varcharの場合

string val = dr["name"].ToString();

intの場合

int? val = dr["status"] == DBNull.Value ? (int?) null : Convert.ToInt32(dr["status"]);

それぞれのタイプMoney, Decimalに交換する場合と同じようにしますint.Net

于 2012-09-20T07:37:20.650 に答える
1

このような拡張メソッドを使用できます。

public static T GetValue<T>(this OracleDataReader reader, string fieldName)
{
    T result = default(T);
    int index = reader.GetOrdinal(fieldName);

    if (reader.IsDBNull(index))
    {
        return default(T);
    }

    if (typeof(T) == typeof(string))
    {
        result = (T)Convert.ChangeType(reader.GetString(index), typeof(T));
    }

    if (typeof(T) == typeof(int))
    {
        result = (T)Convert.ChangeType(reader.GetInt32(index), typeof(T));
    }

    if (typeof(T) == typeof(DateTime))
    {
        result = (T)Convert.ChangeType(reader.GetDateTime(index), typeof(T));
    }

    if (typeof(T) == typeof(byte[]))
    {
        OracleLob blob = reader.GetOracleLob(index);
        result = (T)Convert.ChangeType(blob.Value, typeof(T));
    }

    return result;
}

そして、あなたは次のように使うことができますstring title = reader.GetValue<string>("title")

于 2012-09-20T07:38:45.947 に答える
0

CLRおよびSQLタイプには明確に定義されたマッピングがあるため、問題は、これらのタイプを効率的かつ正確にマッピングする方法です。長期的には、おそらく最も簡単な方法は、クラスのプロパティをの列にマッピングする自動マッピングプロセスを使用することDataRowです。あなたはあなた自身を書くか、オンラインで多くの例/製品を見つけることができます(どんなORMもこれをコア機能として備えています)。

それでも手動で割り当てを行う場合は、データベースからnull値を処理する方法を決定する必要があります。それらを対応するnull許容型に割り当てますか?使いたいdefault(T)ですか?別の値を使用しますか(デフォルトはnullの代わりにはなりません)?たとえば、0度の温度は完全に有効ですが、default(float) == 0。を使用するdefault(T)と、データベースでゼロとnullであった値の違いがわからない場合があります。

割り当て戦略を定義したら、コードを再利用可能な形式(拡張メソッド、ヘルパークラスなど)に配置します。可能な場合は、正確なタイプよりもボックス化を解除することをお勧めします。これが最速です。その後、ボックスを開いて入力し、キャストします。その後、Convertクラスを使用します。

于 2012-09-20T07:41:45.827 に答える