【问题标题】:Best way to handle Datarow DBNull [duplicate]处理 Datarow DBNull 的最佳方法 [重复]
【发布时间】:2012-09-12 13:02:23
【问题描述】:

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

我想知道检查 DBNull 以获取 DataTable - DataRow 值的方法。

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

varchar、money、Int 等。

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

【问题讨论】:

  • 这种工作通常由 orm 或 micro orm 处理,如果您需要一些轻量级的东西可以节省您的工作时间,请查看 Dapper-dot-net code.google.com/p/dapper-dot-net

标签: c# database


【解决方案1】:

试试这个

对于 varchar

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

对于整数

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

Money, Decimal 执行与对int 相同的操作,替换为各自的.Net 类型

【讨论】:

  • 非常适合我:Address.Street = row["STREET"] == DBNull.Value ? "" : 行["STREET"].ToString();
【解决方案2】:

试试:

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

    }
    else
    {
    }
}

【讨论】:

    【解决方案3】:

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

    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&lt;string&gt;("title")

    【讨论】:

    • 该代码在技术上是有效的(所以我不会投反对票),但效率很低。
    • @TimMedora 改进?
    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-12
      • 1970-01-01
      • 1970-01-01
      • 2014-12-05
      • 2010-11-13
      相关资源
      最近更新 更多