你如何正确检查SQLiteDataReader的空值?

时间:2015-08-11 19:36:06

标签: c# sqlite

我正在尝试从SQLite数据库中的表中读取一些行。我试着用我的读者代码:

$settings | ?{$_.Key -eq 'Environment' } | %{ $_.Value = "Prod" }

类似的东西。

我的问题是我检查读者价值的任何方式,比如说:

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; }

如果然后仍会抛出“字典中没有给定的密钥”的异常,它将始终通过。

我只是想要可靠地检查这些值,这样我就可以跳过一个但不必每次都能抓到它。

鉴于上一个检查null的示例:

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

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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:2)

由于数据读取器返回单例实例DBNull.Value,因此空列的值将为DBNull类型。如果列值为null,我们可以使用as运算符将我们的值转换为引用null

String varcharValue = rdr[3] as String;

所以在这里,如果列值为null,我们将有一个string实例或一个null引用。

不幸的是,这种技术不能直接使用值类型。以下代码将生成编译错误:

int numberVlaue = rdr[1] as int; // Will not compile

但是,我们可以使用该类型的nullible版本来完成类似的转换:

int? nullibleNumberValue = rdr[1] as int?;

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