在查询 MS Access 时,我了解到(如何抢占“指定强制转换无效”异常?)我必须通过防御性查询 Text(字符串)值可能为空(或者,显然实际上是 null)使用“ IIF(ISNULL(colName),'',colName) ”构造,例如:
SELECT id, pack_size, IIF(ISNULL(description),'',description), department, subdepartment, IIF(ISNULL(vendor_id),'',vendor_id), IIF(ISNULL(vendor_item),'',vendor_item), avg_cost, list_cost FROM PhunkyPlatypi ORDER BY id
我假设这仅对指定为 required == false 的 Text 列是必需的。我的 ASSumption 错了吗 - 我必须对所有非必需的列执行此操作吗?
具体来说,如果我需要对数据类型为 double 的列进行防御性查询,是否可以这样做:
IIF(ISNULL(two_bagger),0.0,two_bagger)
?
或者更好(人们总是希望):是否有一些更干净/不那么突兀的方式来处理不包含每列数据的结果集?
如果它有任何区别,我正在使用 OleDbDataReader 从 .NET 4.5.1 Web API 应用程序查询 MS Access 数据库(新酒皮中的旧抱怨?)
更新
回复:HansUp 的(Reach for the Sky?)建议:“也许从 .Net 方面进行攻击并让代码更适合 Nulls 会更有成效”,这样的方法是否可以做到,或者是有一种更有效/更安全的方法:
if (null == oleDbD8aReader.GetString(2))
{
description = "Blank description";
}
else
{
description = oleDbD8aReader.GetString(2);
}
?
更新 2
我更改了代码以检查 DBNull,当它是 DBNull 时,将值设置为基于数据类型的通用值(text 为 string.empty,int 为 0,double 为 0.00),但我仍然得到相同的错误消息。
更新 3
我在这一行收到“指定的演员表无效”:
long RedemItemId = (oleDbD8aReader["dbp_id"] is DBNull ? 0 : (long)oleDbD8aReader["dbp_id"]);
dbp_id 是 Access 表中的 LongInt
从查询返回的数据在该列中包含以下值:
5
20
30
40
45
60
70
75
90
120
120
...那么这些值中的任何一个怎么可能无法长时间转换?我应该使用“Convert.ToX()”而不是“(long)”吗?或者...???