如何正确检查SQLiteDataReader是否为空值?

本文关键字:空值 是否 SQLiteDataReader 何正确 检查 | 更新日期: 2023-09-27 18:07:25

我正试图从SQLite数据库中的表中读取一些行。我在我的阅读器代码周围有一个try/catch:

try {
            using (SQLiteConnection dbCon = new SQLiteConnection("Data Source=" + dbPath)) {
                dbCon.Open();
                using (SQLiteCommand command = new SQLiteCommand(sqlcmd, dbCon)) {
                    using (SQLiteDataReader rdr = command.ExecuteReader()) {
                        while (rdr.Read()) {
}
catch(exception ex) { throw ex; }

差不多。

我的问题是我检查阅读器值的任何方式,比如:

if (rdr[3].ToString() != "" && rdr[3] != null) {}

它将始终传递该if,然后仍然抛出"给定键不存在于字典中"的异常。

我只是想可靠地检查这些值,以便我可以跳过一个,而不必每次都触发catch。

根据前面检查null的例子:

if (rdr[3].ToString() != "" || rdr[3] != null) {
int something = Convert.ToInt32(rdr[3]);
}

每次在该字段中没有值时都会出错,因为它也总是通过if中的2次检查。

如何正确检查SQLiteDataReader是否为空值?

我曾经也尝试过检查null类型。实际上,您必须检查DBNull的特殊类型:

if (rdr[3].GetType() != typeof(DBNull)) { }

由于数据读取器返回单例实例DBNull。null列的值将为DBNull类型。如果列值为null

,可以使用as操作符将值转换为引用null,从而利用这一事实。
String varcharValue = rdr[3] as String;

如果列值为空,那么这里我们要么有一个string实例,要么有一个空引用。

不幸的是,该技术不能直接用于值类型。下面的代码将生成一个编译错误:

int numberVlaue = rdr[1] as int; // Will not compile
但是,可以使用该类型的可空版本来完成类似的转换:
int? nullibleNumberValue = rdr[1] as int?;

,然后检查HasValue属性,看看类型是否为null。