我正在尝试从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个检查。
答案 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。