12
(LocalVariable)ABC.string(Name) = (IDataReader)dataReader.GetString(0);

このname値はデータベースからのものです。

ここで何が起こっているかというと、これnamenull読み取り中に例外をスローしている場合です。

ここで if 条件を手動で実行しています。すべての変数をチェックする手動条件を書きたくありません。

私は今、このようなことをしています..

String abc = dataReader.GetValue(0);
if (abc == null)
   //assigning null
else
   //assigning abc value

これに対して拡張メソッドを記述できるようなものはありますか?

4

5 に答える 5

25

データ リーダーから厳密に型指定された値を取得することに関するすべての懸念事項を適切にまとめるいくつかの拡張メソッドを次に示します。値が DbNull の場合、タイプのデフォルトが返されます。which がクラスの場合string、 anullが返されます。フィールドが の場合、int0返されます。int?さらに、 null 許容の int フィールドなどからを期待している場合は、null返されます。

Kumar の場合の特定の使用法:

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/subtext/archive/2010/03/02/generic-nullsafe-idatarecord-field-getter.aspxから

于 2010-04-09T19:17:04.767 に答える
2

上位の解決策と提案を組み合わせたC# 6 矢印式バージョンは、オプションの既定値パラメーターをサポートしGetValue<T>ています。GetValueOrDefault<T>

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));
}
于 2016-03-15T18:05:55.213 に答える
2

私の解決策は次のとおりです。

private static T GetValue<T>(object o) {
    if (typeof(DBNull) != o.GetType()) {
        return (T) o;
    }
    return default(T);
}

いつ、Status = GetValue<string>(currentDataRow["status"])

于 2011-04-01T23:18:50.240 に答える
0

私はこのようなものを使用します:

string abc = (IDataReader)datareader.GetValue(0) ?? "Default";
于 2010-04-09T18:31:10.877 に答える