データセットフィールドDBNull-> int?
質問
SQLServer intフィールド。値はヌルになる場合があります。 DataAdapterはデータセットOKを入力し、DatagridView OKでデータを表示できます。
データセットからプログラムでデータを取得しようとすると、Datasetフィールド取得コードがStronglyTypedExceptionエラーをスローします。
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
public int curr_reading {
get {
try {
return ((int)(this[this.tableHistory.curr_readingColumn]));
}
catch (global::System.InvalidCastException e) {
throw new global::System.Data.StrongTypingException("The value for column \'curr_reading\' in table \'History\' is DBNull.", e);
}
getアクセサーでDBNullをチェックし、nullを返しますが、これを過ぎて... データセット構造が変更されると(まだ開発中)、私の変更(当然のことながら)はなくなります。
この状況に対処する最良の方法は何ですか? データセットレベルで対処することにこだわっているようです。 自動コードジェネレーターに変更をそのままにしておくように指示できる属性がありますか?
解決
データセットには、nullを示すブールプロパティがあります。
int curr_reading = ( Iscurr_readingColumnNull) ?
<default_value> : row.curr_readingColumn;
他のヒント
型付きデータセットデザイナーには、 nullvalue
プロパティがあります。
デフォルトでは、その値は throw exception
です(したがって、生成されたコード)
希望する default value
に設定できます。 0。
次に、例外の代わりに0を返します。 (他のコードが生成されます)
VS2008:これはデータセットデザイナーで直接機能します。
VS2005:デザイナ内の文字列に対してのみ機能しますが、XSDを直接編集してプロパティmsprop:nullValue =&quot; 0&quot;を設定できます
-
自動生成されたコードはそのままにします。 「傍受」する方法はありません。生成されるため、行った変更は遅かれ早かれ確実に吹き飛ばされます。
-
.NET(少なくとも.NET 2.0のsystem.dataビット)は、DBNullから他のものに変換しません。これはひどいですが、それについては何もできません。
-
ToNullable()などの拡張メソッドを作成します。これを実行できます。
。
public static Nullable<T> ToNullable(this object x){
if(x == DBNull.Value)
return default(T); // return null thing
else
return (T)x;
}
そうすれば
int? thing = DataRow["column"].ToNullable<int>();
メモリが提供される場合、.BeginEdit()などを使用して行を編集済みとしてマークする必要があります。その後、おそらく.EndEdit()などを使用して編集し、行を保存します。これらのメソッド(DataSet、DataTable、またはDataRowにある可能性があります)を少し読みたいと思うかもしれません-私の記憶は少しかすんでいます。
これが少なくとも少し役立つことを願っています。
if(row["curr_reading"] is DBNull){
}else{
row.curr_reading;
}