たIDataReaderから値を取得する場合はnull安全な方法
-
25-09-2019 - |
質問
(のLocalVariable)ABC.string(名前)=(たIDataReader)datareader.GetString(0)
この名前の値は、データベースから来ます。.. この名前の値がnullの場合に例外を投げるの?
読みながら何ここで起こってことです ここでの条件ならば、私は手動でいくつかをしています。私はすべての変数を確認するために、手動の条件を書きたくない..
私は今、このような何かをやっている..
string abc = (Idatareader)datareader.GetValue(0);
if(abc = null)
//assiging null
else
assiging abc value
私たちは、このための拡張メソッドを書くことができるようなものはありますか? 感謝
解決
ここでうまくデータリーダーから強く型付けされた値を取得するの周りにあなたの懸念のすべてを包むだろうカップルの拡張メソッドです。値がDbNullにある場合はタイプのデフォルトが返されます。クラスであるstring
の場合は、null
が返されます。フィールドがint
た場合、0
が返されます。あなたがint?
を期待している場合はさらに、NULL可能なint型のフィールドから言って、null
が返されます。
クマーの場合の具体的な使用方法:
string abc = datareader.GetValueOrDefault<string>(0);
一般用途
var name = GetValueOrDefault<string>(reader, "Name");
または
var name = reader.GetValueOrDefault<string>("Name");
または
var name = reader.GetValueOrDefault<string>(0);
拡張
public static class NullSafeGetter
{
public static T GetValueOrDefault<T>(this IDataRecord row, string fieldName)
{
int ordinal = row.GetOrdinal(fieldName);
return row.GetValueOrDefault<T>(ordinal);
}
public static T GetValueOrDefault<T>(this IDataRecord row, int ordinal)
{
return (T)(row.IsDBNull(ordinal) ? default(T) : row.GetValue(ordinal));
}
}
のhttpから:// skysanders .NET /サブテキスト/アーカイブ/ 2010/03/02 /ジェネリック-nullsafe-idatarecordフィールド-getter.aspxする
他のヒント
public static T Get<T>(this IDataRecord row, string fieldName)
{
int ordinal = row.GetOrdinal(fieldName);
return row.Get<T>(ordinal);
}
public static T Get<T>(this IDataRecord row, int ordinal)
{
var value = row.IsDBNull(ordinal) ? default(T) : row.GetValue(ordinal);
return (T)Convert.ChangeType(value, typeof(T));
}
私のソリューションは、次のとおりです。
private static T GetValue<T>(object o) {
if (typeof(DBNull) != o.GetType()) {
return (T) o;
}
return default(T);
}
場合は、Status = GetValue<string>(currentDataRow["status"])
トップソリューションや提案を組み合わせることで、ここでは、オプションのデフォルト値のパラメータを持つGetValue<T>
とGetValueOrDefault<T>
をサポートしたの C#6矢印式のバージョンがある。
public static class DataRecordExtensions {
/// <summary>
/// Generically extracts a field value by name from any IDataRecord as specified type. Will throw if DNE.
/// </summary>
public static T GetValue<T>(this IDataRecord row, string fieldName)
=> row.GetValue<T>(row.GetOrdinal(fieldName));
/// <summary>
/// Generically extracts a field value by ordinal from any IDataRecord as specified type. Will throw if DNE.
/// </summary>
public static T GetValue<T>(this IDataRecord row, int ordinal)
=> (T)row.GetValue(ordinal);
/// <summary>
/// Generically extracts a field value by name from any IDataRecord as specified type. Will return default generic types value if DNE.
/// </summary>
public static T GetValueOrDefault<T>(this IDataRecord row, string fieldName, T defaultValue = default(T))
=> row.GetValueOrDefault<T>(row.GetOrdinal(fieldName), defaultValue);
/// <summary>
/// Generically extracts a field value by ordinal from any IDataRecord as specified type. Will return default generic types value if DNE.
/// </summary>
public static T GetValueOrDefault<T>(this IDataRecord row, int ordinal, T defaultValue = default(T))
=> (T)(row.IsDBNull(ordinal) ? defaultValue : row.GetValue(ordinal));
}
私はこのようなものを使用したいです
string abc = (IDataReader)datareader.GetValue(0) ?? "Default";