处理Datarow DBNull的最佳方法

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

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

防爆

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

varchar,money,Int等。

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

尝试:

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

试试这个

对于varchar

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

对于int

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

对于Money, Decimal执行相同操作以替换相应的.Net类型

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

 public static T GetValue(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; } 

你可以使用like string title = reader.GetValue("title")

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

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

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