8

私はこれの多くのバージョンをSOで見ましたが、どれも私のニーズにうまく機能していないようです。

私のデータは、DateTimeフィールドにnullを許可するベンダーデータベースから取得されます。まず、データをDataTableにプルします。

using (SqlCommand cmd = new SqlCommand(sb.ToString(), conn))
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
    da.Fill(dt);
}

処理のためにDataTableをList<>に変換しています。

var equipment = from i in dt.AsEnumerable()
    select new Equipment()
    {
        Id = i.Field<string>("ID"),
        BeginDate = i.Field<DateTime>("BeginDate"),
        EndDate = i.Field<DateTime>("EndDate"),
        EstimatedLife = i.Field<double>("EstimatedLife")
    }

では、このインスタンスでDBNullをチェックするにはどうすればよいですか?メソッドを書いてみました。

    public DateTime CheckDBNull(object dateTime)
    {
        if (dateTime == DBNull.Value)
            return DateTime.MinValue;
        else
            return (DateTime)dateTime;
    }
4

6 に答える 6

10

使用するIsDBNull()

System.Convert.IsDBNull(value);

またはあなたが持っている場合SqlDataReader

reader.IsDBNull(ordinal);

また、DateTimeプロパティをnull許容(DateTime?)にし、。nullの場合に設定しDBNullます。Field<T>()自動的にこれを行います。

于 2010-10-20T14:19:58.907 に答える
8

考えられるオプションの1つは、構文を使用してnull許容日時として保存することです。DateTime?

null許容型の使用に関するMSDNへのリンクは次のとおりです

于 2010-10-20T14:20:34.540 に答える
5

これを処理する最も簡単な方法は、「as」キーワードを使用してフィールドをデータ型としてキャストすることです。これは、nullになる可能性のあるデータベースフィールドに最適であり、素晴らしくシンプルです。

これについての詳細は次のとおりです。直接キャストと「as」演算子?

例:

    IDataRecord record = FromSomeSqlQuerySource;
    string nullableString;
    DateTime? nullableDateTime;

    nullableString = record["StringFromRecord"] as string;
    nullableDateTime = record["DateTimeFromRecord"] as DateTime?;
于 2017-11-07T15:51:45.157 に答える
2

これは私が日時を読むために使用するいくつかのコードの例です

それはもっとうまく書くことができると確信していますが、私にとってはうまくいきます

   public DateTime? ReadNullableDateTimefromReader(string field, IDataRecord data)
    {

        var a = data[field];
        if (a != DBNull.Value)
        {
            return Convert.ToDateTime(a);
        }
        return null;
    }

    public DateTime ReadDateTimefromReader(string field, IDataRecord data)
    {
        DateTime value;
        var valueAsString = data[field].ToString();
        try
        {
            value = DateTime.Parse(valueAsString);
        }
        catch (Exception)
        {
            throw new Exception("Cannot read Datetime from reader");
        }

        return value;
    }
于 2010-10-20T14:28:52.937 に答える
0

DataRow["ColumnName"] is DBNullDateTimenullを比較するために使用する必要があります。

例えば:

 if(studentDataRow["JoinDate"] is DBNull) { // Do something here }
于 2014-11-19T08:34:51.823 に答える
0

すべてのプロジェクトで使用するジェネリック拡張メソッドを作成しました。

public static object GetValueSafely<T>(this System.Data.DataTable dt, string ColumnName, int index)
{
    if (typeof(T) == typeof(int))
    {
        if (dt.Rows[index][ColumnName] != DBNull.Value)
            return dt.Rows[index][ColumnName];
        else
            return 0;
    }
    else if (typeof(T) == typeof(double))
    {
        if (dt.Rows[index][ColumnName] != DBNull.Value)
            return dt.Rows[index][ColumnName];
        else
            return 0;
    }
    else if (typeof(T) == typeof(decimal))
    {
        if (dt.Rows[index][ColumnName] != DBNull.Value)
            return dt.Rows[index][ColumnName];
        else
            return 0;
    }
    else if (typeof(T) == typeof(float))
    {
        if (dt.Rows[index][ColumnName] != DBNull.Value)
            return dt.Rows[index][ColumnName];
        else
            return 0;
    }
    else if (typeof(T) == typeof(string))
    {
        if (dt.Rows[index][ColumnName] != DBNull.Value)
            return dt.Rows[index][ColumnName];
        else
            return string.Empty;
    }
    else if (typeof(T) == typeof(byte))
    {
        if (dt.Rows[index][ColumnName] != DBNull.Value)
            return dt.Rows[index][ColumnName];
        else
            return 0;
    }
    else if (typeof(T) == typeof(DateTime))
    {
        if (dt.Rows[index][ColumnName] != DBNull.Value)
            return dt.Rows[index][ColumnName];
        else
            return DateTime.MinValue;
    }
    else if (typeof(T) == typeof(bool))
    {
        if (dt.Rows[index][ColumnName] != DBNull.Value)
            return dt.Rows[index][ColumnName];
        else
            return false;
    }
    if (dt.Rows[index][ColumnName] != DBNull.Value)
        return dt.Rows[index][ColumnName];
    else
        return null;
}

使用例:

private void Example()
{
    DataTable dt = GetDataFromDb() // get data from database...
    for (int i = 0; i < dt.Rows.Count; i++)
    {
        Console.WriteLine((DateTime)dt.GetValueSafely<DateTime>("SomeDateColumn", i));
        Console.WriteLine((int)dt.GetValueSafely<int>("SomeIntColumn", i));
        Console.WriteLine((string)dt.GetValueSafely<string>("SomeStringColumn", i));
    }
}
于 2019-03-04T12:36:08.413 に答える