可能重复:
Best way to check if a Data Table has a null value in it
我想知道检查DBNull的DataTable - DataRow值的方法应该是什么。
我有一个DataRow,它从行类型中获取数据库信息,如:
varchar,money,Int等。
处理这种情况应该是我(简单和甜蜜)的方法。
答案 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
类。