我想用来自 MySql 数据库的数据初始化一个类。一些字段可以为空:
Dim dr As MySqlDataReader = ...
Dim item As New Item(dr.GetInt16(0), dr.GetString(1), dr.GetString(2))
假设数据库中的最后两个字段可能为 NULL,因此在该字段上调用 GetString 会导致异常。
我当然可以在获取每个字段之前编写代码来测试 NULL:
dim field1 as String
if ( dr.IsDbNull(1) )
field1 = Nothing ' or even ""
else
field1 = dr.GetString(1)
但如果您有很多字段,这就是“如果”的噩梦。
为此,我重写了 IIf VB 函数,使其更具类型化,从而避免强制转换:
Namespace Util
Public Shared Function IIf(Of T)(ByVal condition As Boolean, ByVal iftrue As T, ByVal iffalse As T) As T
If condition Then Return iftrue Else Return iffalse
End Function
所以我可以这样写:
Dim item As New Item(
dr.GetInt16(0),
Util.IIf(dr.IsDbNull(1), "", dr.GetString(1),
Util.IIf(dr.IsDbNull(2), "", dr.GetString(2))
类型化的 IIf 在其他情况下效果很好,但不幸的是在这种情况下效果不佳,因为它是一个普通函数而不是语言关键字,每个输入在调用期间评估参数,并且当字段为 NULL 时引发异常。
你能想到一个优雅的 if-less 解决方案吗?
最佳答案
首先,我建议您使用 ORM 映射器 - 现在很少有情况需要您手动“映射”。
如果这是其中一种情况,我建议您在访问 Data Reader 时使用字段名称而不是索引。
并回答您最初的问题:尝试扩展方法。对不起 C#,但 VB.NET 语法让我抓狂:
public static class DbDataReaderExtensions
{
public static T GetField<T>(this DbDataReader dbDataReader, string fieldName,
T defaultValue)
{
if(dbDataReader.IsDBNull(fieldName))
return defaultValue;
return (T)dbDataReader[fieldName];
}
}
关于mysql - VB.NET 2010 和 MySql - 为懒惰的人处理 DB NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3350912/