2014年4月4日金曜日

DataRowやDataRowViewで、DBNullやnullやNullableを設定したり取得したりする件

IsNullになっている列から、値を取得

DataRow → DBNull
DataRowView → DBNull

結論: DataRow.IsNull(...) == true の場合、DataRow[...] では DBNull 型のインスタンスが返って来る。

※ クラス(例: String)でも値型(例: TimeSpan)でも、DBNull が出て来る。
※ クラス(例: String)の場合、null を突っ込んだ後でも、DBNull が出て来る。

値を設定

結論: 代入で null に設定したい場合は、常に DBNull.Value を渡すのが無難。

クラス(例: String)の場合:

[Ok] DataRow ← DBNull
[Ok] DataRowView ← DBNull
[Ok] DataRow ← null
[Ok] DataRowView ← null

値型(例: TimeSpan)の場合:

[Ok] DataRow ← DBNull
[Ok] DataRowView ← DBNull
[例外発生] DataRow ← null
[例外発生] DataRowView ← null
[例外発生] DataRow ← new Nullable<TimeSpan>();
[例外発生] DataRowView ← new Nullable<TimeSpan>();

※ 『追加情報: Column 't' を null に設定できません。DBNull を使用してください。』

オマケ LINQ to DataSet でのクエリ
DataRow.Field<T>("列名");
DataRow.SetField<T>("列名", 値);
T には int? など Nullable が利用できます。

総括

判定は、{クラス・値}、{DataRow・DataRowView}の別に関わらず、DBNull で実施する:
  • dr["Column"] is DBNull
  • drv["Column"] is DBNull
代入もDBNullで実施する。
  • dr["Column"] = DBNull.Value
  • drv["Column"] = DBNull.Value

2014年4月2日水曜日

ClickOnce アプリのデバッグと、セキュリティの警告

「現在のプロジェクト設定は、プロジェクトが特定のセキュリティのアクセス許可でデバッグされることを指定しています。このモードでは、コマンドライン引数は実行可能ファイルに渡されません。デバッグを続行しますか?」


ーーー

コマンドライン引数を確かめますと、確かに指定しています。


ーーー

解決するには、XXX.csproj.userファイル中、

<EnableSecurityDebugging>false</EnableSecurityDebugging>

こちらをfalseに設定します。

ーーー

「特定のセキュリティのアクセス許可」とやらは提供されなくなりますが、そういう複雑なプロジェクトを組んでいらっしゃる方は、普通、入口を切り分けると思いますので。。。

            if (ApplicationDeployment.IsNetworkDeployed) {
// ClickOnce 起動時は、こちら
// 追加の処理…
}
else {
// それ以外 (exe ファイルの直接起動時、デバッグ時など)
// 追加の処理…
}

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
return;

ーーー

画面の設定手順としましては:

プロジェクトのプロパティ
→「セキュリティ」タブ
→「詳細設定」ボタン
→「このアプリケーションを選択されたアクセス許可のセットでデバッグする」 チェックを外す。

ーーー

ただし、アセンブリ参照の内容によってはこの画面まで至ることができません。その場合、ファイルの直接編集が有効です。