DBNullでDataTable-DataRow値をチェックする方法を知りたいです。
元
次のような行タイプからデータベースから情報をフェッチするDataRowがあります。
varchar、money、Intなど。
そのような状況に対処するための私の(シンプルで甘い)アプローチはどうあるべきか。
DBNullでDataTable-DataRow値をチェックする方法を知りたいです。
次のような行タイプからデータベースから情報をフェッチするDataRowがあります。
varchar、money、Intなど。
そのような状況に対処するための私の(シンプルで甘い)アプローチはどうあるべきか。
試す:
foreach(DataRow row in table.Rows)
{
object value = row["ColumnName"];
if (value == DBNull.Value)
{
}
else
{
}
}
これを試して
varcharの場合
string val = dr["name"].ToString();
intの場合
int? val = dr["status"] == DBNull.Value ? (int?) null : Convert.ToInt32(dr["status"]);
それぞれのタイプMoney, Decimal
に交換する場合と同じようにしますint
.Net
このような拡張メソッドを使用できます。
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")
CLRおよびSQLタイプには明確に定義されたマッピングがあるため、問題は、これらのタイプを効率的かつ正確にマッピングする方法です。長期的には、おそらく最も簡単な方法は、クラスのプロパティをの列にマッピングする自動マッピングプロセスを使用することDataRow
です。あなたはあなた自身を書くか、オンラインで多くの例/製品を見つけることができます(どんなORMもこれをコア機能として備えています)。
それでも手動で割り当てを行う場合は、データベースからnull値を処理する方法を決定する必要があります。それらを対応するnull許容型に割り当てますか?使いたいdefault(T)
ですか?別の値を使用しますか(デフォルトはnullの代わりにはなりません)?たとえば、0度の温度は完全に有効ですが、default(float) == 0
。を使用するdefault(T)
と、データベースでゼロとnullであった値の違いがわからない場合があります。
割り当て戦略を定義したら、コードを再利用可能な形式(拡張メソッド、ヘルパークラスなど)に配置します。可能な場合は、正確なタイプよりもボックス化を解除することをお勧めします。これが最速です。その後、ボックスを開いて入力し、キャストします。その後、Convert
クラスを使用します。