MS Accessのクエリで、テキスト(文字列)値が空(または、実際には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 データベースにクエリを実行しています (新しいワインスキンの古い泣き言?)
アップデート
Re: HansUp の (Reach for the Sky?) の提案: 「.Net 側からこれを攻撃し、コードをより Null に対応させる方が生産的になるかもしれません」より効率的/安全な方法があります:
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
...では、これらの値のいずれかが long へのキャストに失敗している可能性はありますか? 「(long)」の代わりに「Convert.ToX()」を使用する必要がありますか? または...???