VS2005データセットとNullチェック
前回のテーブルアダプタネタ続いて、今回はデータセットの注意事項を。
型指定データセットを使う場合はNullを許容するカラムの扱いに注意してください。
たとえば、SQL Server 2005に付いている「AdventureWorks」DBの
「Employee」テーブルでデータセットを作ったとしましょう。
Employeeテーブルでは「ManagerID」がNullを許容するカラムとして定義(ちなみにint型)されています。
その時自動生成されるデータセットのManagerIDカラムのコードが下です。
#正確に言うと、自動生成されるEmployeeRowクラスのコード
[System.Diagnostics.DebuggerNonUserCodeAttribute()] public int ManagerID { get { try { return ((int)(this[this.tableEmployee.ManagerIDColumn])); } catch (System.InvalidCastException e) { throw new System.Data.StrongTypingException("テーブル \'Employee\' にある列 \'ManagerID\' の値は DBNull です。", e); } } set { this[this.tableEmployee.ManagerIDColumn] = value; } }
ManagerIDにアクセスしようとしたら上記コードが動きます。
キャストに失敗したらここが今日のポイントです。
DBNullを許容しているカラムで、実際にその値がNullだったら例外が発生する。
ちなみに、VSのデータセットのデザイナ画面上でManagerIDカラムを選択し、
プロパティウィンドウ上でNullValueプロパティを確認すると...
(Throw exception)に設定されています。
そのリストボックスを開くと「Empty」やら「Null」やらが表示されます。
なーんだ、ここのプロパティの値を変更してやればいいじゃん、と思いきや。
以下のような警告ダイアログが。。。
プロパティの値が無効です。 System.String に定義されていない列に対しては、(Throw exception) のみが有効な値です。
String以外は、Throw Exception以外に設定できないんですね。。。
対策としては、ManagerIDカラムにアクセスする前にNullかどうか確認する必要があります。
下みたいな感じでしょうか。
if(!EmployeeRow.IsManagerIDNull) int managerId = EmployeeRow.ManagerID;
うーむ、納得はいきませんが。。。しょうがないか。
何か良い方法ありましたらコメントお願いします。