mysql - VB.NET 2010 和 MySql - 为懒惰的人处理 DB NULL

标签 mysql sqldatareader dbnull vb.net-2010

我想用来自 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/

相关文章:

c# - Winforms 中的 DatagridView,SqlDataReader 是否在循环结束时自动关闭?

php - SQL - 根据查询中的结果添加标志 - 最佳实践?

javascript - 使用nodejs mysql模块从mysql获取JSON数据

mysql - 哪些字符可以用 UTF 8 表示但不能用 Latin1 表示?

php - current_timestamp 只获取年、月、日

c# - 将 DBNull.Value 和空文本框值传递给数据库

c# - 处理 400 万条记录时内存不足

asp.net - 如何使用 DataReader 填充 DataTable

vb.net - 如何在vb中创建一个条件来检查数据表项是否为空

c# - 是 DBNull 与 DBNull.Value.Equals()