如何正确检查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次检查。
我曾经也尝试过检查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。