質問

(の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";
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top