2

SQLServer int フィールド。値が null の場合もあります。DataAdapter はデータセットを埋めることができ、DatagridView にデータを表示することもできます。

プログラムでデータセットからデータを取得しようとすると、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を返すことでこれを乗り越えましたが...データセット構造が変更されると(まだ開発中)、私の変更は(当然のことながら)なくなりました。

この状況を処理する最善の方法は何ですか? データセットレベルでそれを扱うことに行き詰まっているようです。自動コード ジェネレーターに変更をそのまま残すように指示できる何らかの属性はありますか?

4

5 に答える 5

3
  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>();
于 2009-03-02T02:53:52.910 に答える
1

データセットには、null を示す boolean プロパティがあります。

int curr_reading = ( Iscurr_readingColumnNull) ? 
                   <default_value> : row.curr_readingColumn;
于 2009-03-02T02:52:28.653 に答える
0

メモリが機能する場合は、.BeginEdit() などを使用して行を編集中としてマークする必要があります。次に、おそらく .EndEdit() などを使用して編集を行い、行を保存します。これらのメソッド (DataSet、DataTable、または DataRow にある可能性があります) を少し読みたいと思うかもしれません - 私の記憶は少し曖昧です。

これが少なくとも少し役立つことを願っています。

于 2009-03-02T02:49:44.310 に答える
0
if(row["curr_reading"] is DBNull){

}else{
    row.curr_reading;
}
于 2009-09-07T06:33:25.493 に答える