21

次のようなコードがあるとします。

while(myDataReader.Read())
{
  myObject.intVal = Convert.ToInt32(myDataReader["mycolumn"] ?? 0);
}

エラーがスローされます:

オブジェクトを DBNull から他の型にキャストすることはできません。

nullable int として定義することintValはオプションではありません。上記を行う方法はありますか?

4

6 に答える 6

17

もう1つのオプションがあります:

while (myDataReader.Read())
{
    myObject.intVal = (myDataReader["mycolumn"] as int? ?? 0);
}
于 2014-04-24T18:27:10.543 に答える
14

拡張メソッドを使用できますか?(頭のてっぺんから書き留めた)

public static class DataReaderExtensions 
{
    public static T Read<T>(this SqlDataReader reader, string column, T defaultValue = default(T))
    {
        var value = reader[column];

        return (T)((DBNull.Value.Equals(value))
                   ? defaultValue
                   : Convert.ChangeType(value, typeof(T)));
    }
}

あなたはそれを次のように使うでしょう:

while(myDataReader.Read())
{
  int i = myDataReader.Read<int>("mycolumn", 0);
}
于 2012-02-24T19:33:35.267 に答える
6

簡単に使えInt32.Tryparseますか?

int number;
bool result = Int32.TryParse(myDataReader["mycolumn"].ToString(), out number);

MSDNによるとnumber、変換が失敗した場合は0が含まれます

于 2012-02-24T19:38:46.620 に答える
5

次のようなものはどうですか:

object x = DBNull.Value;
int y = (x as Int32?).GetValueOrDefault(); //This will be 0

またはあなたの場合:

int i = (myDataReader["mycolumn"] as Int32?).GetValueOrDefault();
于 2012-02-24T19:35:27.967 に答える
2

DBNull.Valuenull合体演算子( != )以外のものを使用してみませんかnull

int i = myDataReader["mycolumn"] == DBNull.Value ?
            Convert.ToInt32(myDataReader["mycolumn"]) :
            0;

あなたはいつでもそれをきちんとした拡張メソッドでまとめることができます:

public static T Read<T>(this DataReader reader, string column, T defaultVal)
{
    if(reader[column] == DBNull.Value) return defaultVal;
    return Convert.ChangeType(reader[column], typeof(T));
}
于 2012-02-24T19:33:28.200 に答える
1

いいえ、ヌルに対してのみ機能します。

DBNull をチェックし、代わりにデフォルト値を返すオブジェクトの拡張メソッドはどうですか?

//may not compile or be syntactically correct! Just the general idea.
public static object DefaultIfDBNull( this object TheObject, object DefaultValue )
{
    if( TheObject is DBNull )
        return DefaultValue;
    return TheObject;
}
于 2012-02-24T19:34:37.220 に答える