处理Datarow DBNull的最佳方法

时间:2012-09-20 07:33:34

标签: c# database

  

可能重复:
  Best way to check if a Data Table has a null value in it

我想知道检查DBNull的DataTable - DataRow值的方法应该是什么。

实施例

我有一个DataRow,它从行类型中获取数据库信息,如:

varchar,money,Int等。

处理这种情况应该是我(简单和甜蜜)的方法。

4 个答案:

答案 0 :(得分:22)

尝试:

foreach(DataRow row in table.Rows)
{
    object value = row["ColumnName"];
    if (value == DBNull.Value)
    {

    }
    else
    {
    }
}

答案 1 :(得分:5)

试试这个

对于varchar

string val = dr["name"].ToString();

对于int

int? val = dr["status"] == DBNull.Value ? (int?) null : Convert.ToInt32(dr["status"]);

Money, Decimal执行与int替换相应的.Net类型相同的操作

答案 2 :(得分:1)

您可以使用这样的扩展方法;

public static T GetValue<T>(this OracleDataReader reader, string fieldName)
{
    T result = default(T);
    int index = reader.GetOrdinal(fieldName);

    if (reader.IsDBNull(index))
    {
        return default(T);
    }

    if (typeof(T) == typeof(string))
    {
        result = (T)Convert.ChangeType(reader.GetString(index), typeof(T));
    }

    if (typeof(T) == typeof(int))
    {
        result = (T)Convert.ChangeType(reader.GetInt32(index), typeof(T));
    }

    if (typeof(T) == typeof(DateTime))
    {
        result = (T)Convert.ChangeType(reader.GetDateTime(index), typeof(T));
    }

    if (typeof(T) == typeof(byte[]))
    {
        OracleLob blob = reader.GetOracleLob(index);
        result = (T)Convert.ChangeType(blob.Value, typeof(T));
    }

    return result;
}

您可以使用string title = reader.GetValue<string>("title")

之类的内容

答案 3 :(得分:0)

CLR和SQL类型有clearly-defined mappings,所以问题实际上是如何有效和准确地映射这些类型。从长远来看,最简单的方法可能是使用自动映射过程,将您的类的属性映射到DataRow中的列。您可以自己编写或在线查找许多示例/产品(任何ORM都将此作为核心功能)。

假设您仍想进行手动分配,则需要确定如何处理数据库中的空值。您想将它们分配给相应的可空类型吗?你想使用default(T)吗?你想使用另一个值(默认值可能是null的替代品)吗?例如,0度的温度完全有效,但default(float) == 0。如果使用default(T),则可能无法区分零和数据库中为空的值。

一旦定义了赋值策略,就将代码放入可重用的表单中(扩展方法,帮助程序类等)。如果可能的话,首选拆箱到确切的类型,因为这将是最快的。接下来,unbox键入,然后强制转换。然后,使用Convert类。