可能重复:
检查数据表中是否包含空值的最佳方法
我想知道检查 DBNull 以获取 DataTable - DataRow 值的方法应该是什么。
前任
我有一个 DataRow 从数据库中获取信息的行类型,例如:
varchar、money、Int 等。
我应该用什么(简单而甜蜜)的方法来处理这种情况。
可能重复:
检查数据表中是否包含空值的最佳方法
我想知道检查 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? val = dr["status"] == DBNull.Value ? (int?) null : Convert.ToInt32(dr["status"]);
执行与替换相应类型相同的Money, Decimal
操作int
.Net
您可以使用这样的扩展方法;
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")
CLR 和 SQL 类型有明确定义的映射,所以问题实际上是如何高效准确地映射这些类型。从长远来看,最简单的方法可能是使用自动映射过程,将类的属性映射到DataRow
. 您可以自己编写或在线查找许多示例/产品(任何 ORM 都将其作为核心功能)。
假设您仍想进行手动分配,您需要确定您希望如何处理来自数据库的空值。您想将它们分配给相应的可为空类型吗?你想用default(T)
吗?你想使用另一个值吗(默认值可能是 null 的不良替代品)?例如,0 度的温度是完全有效的,但是default(float) == 0
. 如果您使用default(T)
,您可能无法区分零和数据库中为空的值之间的区别。
定义好分配策略后,将代码放入可重用的形式(扩展方法、辅助类等)。如果可能的话,最好取消装箱到确切的类型,因为这将是最快的。之后,拆箱输入,然后投射。之后,使用Convert
该类。