在Web API应用程序中查询MS Access数据库时,如果我尝试将空字符串分配给变量,则会出现“指定的强制转换无效”异常。 IOW,当这段代码:
var accountID = oleDbD8aReader.GetInt16(0);
var platypusName = oleDbD8aReader.GetString(1);
...到达记录,其中结果集中的第二列包含空/空字符串,它会发生炸弹。
所以,我认为我可以在这样的传球上解决这个问题:
string platypusName;
var accountID = oleDbD8aReader.GetInt16(0);
if (!string.IsNullOrEmpty(oleDbD8aReader.GetString(1)))
{
platypusName = oleDbD8aReader.GetString(1);
}
else
{
platypusName = string.Empty;
}
...但它不起作用 - 我仍然得到“指定演员阵容无效”例外。
如何安全地检查那里的空字符串/空值并忽略它通过结果集以便它将获得后续记录?
或者我可以通过更改SQL语句来排除结果集中的空/空字符串吗?如果是这样,怎么样?查询采用以下格式:
SELECT td_duckbill_accounts.platypus_no, t_accounts.name
FROM t_accounts
INNER JOIN td_duckbill_accounts ON t_accounts.account_no = td_duckbill_accounts.account_no
ORDER BY td_duckbill_accounts.platypus_no
答案 0 :(得分:1)
我认为让查询返回空字符串很容易解决:
SELECT td_duckbill_accounts.platypus_no,
IIF(ISNULL(t_accounts.name),'',t_accounts.name) AS name
FROM t_accounts
INNER JOIN td_duckbill_accounts ON t_accounts.account_no = td_duckbill_accounts.account_no
ORDER BY td_duckbill_accounts.platypus_no
这也应该有效,但我现在无法测试:
SELECT td_duckbill_accounts.platypus_no,
Nz(t_accounts.name,'') AS name
FROM t_accounts
INNER JOIN td_duckbill_accounts ON t_accounts.account_no = td_duckbill_accounts.account_no
ORDER BY td_duckbill_accounts.platypus_no
答案 1 :(得分:0)
有时需要更改OleDbDataReader中使用的数据类型方法,因为此代码和注释显示:
while (oleDbD8aReader != null && oleDbD8aReader.Read())
{
string accountId = oleDbD8aReader.GetString(0);
string accountName = oleDbD8aReader.GetString(1);
//int useOnItems = oleDbD8aReader.GetInt32(2); <= get "specified cast not valid" with Int32
int useOnItems = oleDbD8aReader.GetInt16(2); // This works
expenses.Add(new Expense { account_id = accountId, name = accountName, use_on_items = useOnItems });
}
基础表中的数据类型是Integer,所以我想LongInteger(另一种Access整数类型)GetInt32()将是要使用的OleDbDataReader方法。