我有这样的代码:
foreach (DataRow row in dataTable.Rows)
{
if ((string)row["Forename"] != record.Forename)
{
// Do something
}
}
效果很好,但如果数据库中row["Forename"]
为null
,那么它实际上是DBNull
,它不能将DBNull
强制转换为字符串,或执行比较在DBNull
和string
之间。有些值也是nullable<int>
,无法将DBNull
与int?
进行比较
是否有帮助方法可以让我进行更好的比较,还是我必须自己编写扩展方法?
答案 0 :(得分:5)
您可以使用支持可空类型的DataRow.Field
扩展方法:
foreach (DataRow row in dataTable.Rows)
{
int? id = row.Field<int?>("ID");
if(id.HasValue)
{
Console.Write("ID: " + id.Value);
}
}
由于string
是引用类型,因此默认情况下为null
。您可以使用DataRow.IsNull
来检查它是否为DBNull.Value
:
foreach (DataRow row in dataTable.Rows)
{
if(row.IsNull("Forename"))
{
// ...
}
else
{
string foreName = row.Field<string>("Forename");
Console.Write("ForeName: " + foreName);
}
}
答案 1 :(得分:1)
您可以像这样编写自己的扩展方法
public static T GetField<T>(this DataRow row,string columnName)
{
object value = row[columnname];
return (value != DbNull.Value)? (T)value : default(T);
}
然后你可以使用
if (row.GetField<string>(columnname) != record.Forename)
{
// Do something
}
此扩展程序也应支持可空类型
var value = row.GetField<int?>(columnname);
与DataRowExtension.Field和我们的实现的唯一区别在于,当我们尝试将DbNull.Value
强制转换为任何值类型(除了可空类型)时它将抛出异常,在这种情况下,此方法将返回默认值。