- ベストアンサー
ADO.NETのデータベースについて
- ADO.NETでデータベースの作成とフィールドの変更、更新がうまくいかない問題が発生
- プログラムの内容はAccessデータからの表の読み込みと挿入、変更、削除、データの更新
- 原因を教えていただけると助かります
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
dsに取得するデータが where句で選別されているので これにより 1行しか返さないのではないかと思います 『通し番号』とあるので テーブルの中で一意の値なのでしょう OleDbCommanBuilderの使い方をリファレンスで確認しましょう //test 部分の selectCommand等を daやda2の各コマンドに再設定しているのであれば間違った使い方の可能性が高いです daの生成時に選択クエリーを与えたのであればSelectCommandプロパティが生成されています このdaを与えてCommnadBuilderを生成する時点で daのSelectCommand,InsertCommand,UpdateCommand,DeleteCommandが更新されるはずです
その他の回答 (3)
- redfox63
- ベストアンサー率71% (1325/1856)
確認のため簡単なプロジェクトを組んでやってみましたが どうも Adpter/CommandBulider経由でやると Updateなどが上手く機能しないような状況になってしまいます そこで プロジェクト > 追加 > 新しいの項目 > データセット を追加し このxsdファイルに TableAdapterを追加 ウィザードで SQLなどを指定 フォームへのデータ表示更新のために 『データ ソース』から追加 といった手順で BindingSource経由にしてみたところ Updateも問題なくいくようです 既存のAdapterクラスのUpdateメソッドに対しての設定が足りないのだろうと思いますが調べきれておりません m(__)m
お礼
redfox63さん、回答ありがとうございます。m(_)m お手数をお掛けしてしまい申し訳ありませんでした。私も色々やってみたのですが、CommandBulider経由でのUpdateは、うまくいきませんでした。もう少しUpdateメソッドについて調べてみようと思います。ありがとうございました。m(_)m
- redfox63
- ベストアンサー率71% (1325/1856)
ごめんなさい m(__)m 少々勘違いがあったようです CommandBuilderを生成した時点でDataAtdpterのCommand群は更新されません builder = gcnew OleDbCommandBuilder(da); を行って da->InsertCommand = builder->GetInsertCommand(); da->DeleteCommand = builder->GetDeleteCommand(); da->UpdateCommand = builder->GetUpdateCommand(); といった具合に自動生成されたコマンド群を設定してください
補足
redfox63さん、回答ありがとうございます。m(_)m リファレンスではSelectCommandの設定後、InsertCommand、DeleteCommand、UpdateCommandが自動生成されるとあるのですが、その場合でもInsertCommand、DeleteCommand、UpdateCommandは、 builder->GetInsertCommand(); のように設定が必要ということでしょうか? また、生成されたInsertCommand、DeleteCommand、UpdateCommandの初期値はどのような中身が設定されるのでしょうか?質問を重ねてしまい申し訳ないのですが、よろしくお願いいたします。m(_)m
- redfox63
- ベストアンサー率71% (1325/1856)
アクセスのデータを クエリから取得しているのでしょうか? クエリからでは Update等の更新は出来そうに無いと思います クエリーのSQLを使って DataSetを取得しましょう 2行目などの取得が出来ないとのことですが ds->Tables["Table"]->Rows.Count の値はいくつになっているのでしょう
補足
redfox63さん、早速の回答ありがとうございます。m(_)m Accessのデータは、テーブルからds(DataSet)にデータを取得しています。dsの変更後、dsに対してupdateを実行して、外部キーを持っているクエリ1をVC++のDataGridViewに表示させています。(データベースに不慣れなので間違っていればご指摘くださいm(_)m) もう一つ、ご指摘のあったテーブルのカレントの行を以下の方法で調べて見たのですが、「1」となっていました。 int i = ds->Tables["Table"]->Rows->Count;
補足
redfox63さん、回答ありがとうございます。m(_)m ds->Tables["Table"]->Rows[1]->Delete(); のRowsの添え字を0以外に設定するとエラーになる件は、redfox63さんご指摘の通り、selectCommand->CommandTextでwhere句を使い1行のみを抽出していたためでした。where句を削除することによって意図したデータの変更ができました。ありがとうございました。m(_)m また、質問を重ねてしまい申し訳ないのですが、CommnadBuilderについて一つ質問させてください。 OleDbCommandBuilder^ builder = gcnew OleDbCommandBuilder(da); のようにOleDbCommandBuilderをインスタンス化して、SelectCommandを手動で用意すると、InsertCommand,UpdateCommand,DeleteCommandが自動的に生成されると、リファレンスに書かれていたのですが、InsertCommand,UpdateCommand,DeleteCommandは、SelectCommand設定後に使用できるようになるということでしょうか? また、InsertCommand,UpdateCommand,DeleteCommandは、生成後はパラメーターやスキーマの情報は、SelectCommandに設定された情報を取得して使用するのでしょうか? 以上、お手数ですがご回答いただければ幸いです。m(_)m