質問

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;を設定できます

  1. 自動生成されたコードはそのままにします。 「傍受」する方法はありません。生成されるため、行った変更は遅かれ早かれ確実に吹き飛ばされます。

  2. .NET(少なくとも.NET 2.0のsystem.dataビット)は、DBNullから他のものに変換しません。これはひどいですが、それについては何もできません。

  3. 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;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top