16

可能重复:
检查数据表中是否包含空值的最佳方法

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

前任

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

varchar、money、Int 等。

我应该用什么(简单而甜蜜)的方法来处理这种情况。

4

4 回答 4

26

尝试:

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

    }
    else
    {
    }
}
于 2012-09-20T07:38:10.023 回答
6

尝试这个

对于 varchar

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

对于整数

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

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

于 2012-09-20T07:37:20.650 回答
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")

于 2012-09-20T07:38:45.947 回答
0

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

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

定义好分配策略后,将代码放入可重用的形式(扩展方法、辅助类等)。如果可能的话,最好取消装箱到确切的类型,因为这将是最快的。之后,拆箱输入,然后投射。之后,使用Convert该类。

于 2012-09-20T07:41:45.827 回答