
こんにちは。いつもお世話になっております。
プログラミングの初心者で、現在VC++でプログラムを作成しています。環境は、OSがWindowsXP、統合環境はVisualStudio2008 Professionalを使用しています.
ADO.NETでデータベースを作成しているのですが、DataSetを介して、任意のフィールドを変更・更新がうまくいきません。プログラムの内容は、保存されているAccessデータから表を読み込み、その表に対して挿入、変更、削除を行い、最後にupdateをしてAccessのデータを更新するというものです。以下、プログラムの一部を抜粋します。拙い説明で申し訳ありません。原因が分かる方、よろしくご教授ください。
m(_)m
private: bool LoadAccessFile(String^ path)
{
// コネクションを作成
OleDbConnection^ cn = gcnew OleDbConnection();
cn->ConnectionString =
"Provider=Microsoft.Jet.OLEDB.4.0;"
"Data Source=" + path;
// すべてのデータを読み込む
OleDbDataAdapter^ da = gcnew OleDbDataAdapter("select * from 実績テーブル", cn);
OleDbDataAdapter^ da2 = gcnew OleDbDataAdapter("select * from クエリ1", cn);
OleDbCommandBuilder^ builder = gcnew OleDbCommandBuilder(da);
//test
OleDbCommand^ selectCommand = cn->CreateCommand();
OleDbCommand^ selectCommand2 = cn->CreateCommand();
OleDbCommand^ insertCommand = cn->CreateCommand();
OleDbCommand^ updateCommand = cn->CreateCommand();
OleDbCommand^ deleteCommand = cn->CreateCommand();
selectCommand->CommandText = "select 通し番号, 日付, 内容, 金額, カテゴリー番号, 銀行口座通し番号 from 実績テーブル
where 通し番号=2";
selectCommand2->CommandText = "select 通し番号, 日付, 内容, 金額, カテゴリー名称, 銀行口座口座名称 from クエリ1";
insertCommand->CommandText = "insert into 実績テーブル (通し番号, 日付, 内容, 金額, カテゴリー番号, 銀行口座通し番号)
values (@通し番号, @日付, @内容, @金額, @カテゴリー番号, @銀行口座通し番号)";
(中略)
// OleDbDataAdapterのスキーマと、SelectCommandで抽出したデータを格納
da->FillSchema(ds, System::Data::SchemaType::Mapped);
da->Fill(ds->Tables["Table"]);
// "Table"表の2行3列目のデータを変更
ds->Tables->Add("クエリ1");
//test(090223)
DataRow^ row = ds->Tables["Table"]->Rows[1];
//Rows[0]の添え字を0以外にするとエラー。「位置1に行がありません」
DataColumn^ column = ds->Tables["Table"]->Columns[2];
row[column] = "本";
// "Table"表の0行目を削除
ds->Tables["Table"]->Rows[0]->Delete();
//Rows[0]の添え字を0以外にするとエラー。「位置1に行がありません」
No.2ベストアンサー
- 回答日時:
dsに取得するデータが where句で選別されているので
これにより 1行しか返さないのではないかと思います
『通し番号』とあるので テーブルの中で一意の値なのでしょう
OleDbCommanBuilderの使い方をリファレンスで確認しましょう
//test
部分の selectCommand等を daやda2の各コマンドに再設定しているのであれば間違った使い方の可能性が高いです
daの生成時に選択クエリーを与えたのであればSelectCommandプロパティが生成されています
このdaを与えてCommnadBuilderを生成する時点で
daのSelectCommand,InsertCommand,UpdateCommand,DeleteCommandが更新されるはずです
この回答への補足
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
No.4
- 回答日時:
確認のため簡単なプロジェクトを組んでやってみましたが
どうも Adpter/CommandBulider経由でやると Updateなどが上手く機能しないような状況になってしまいます
そこで
プロジェクト > 追加 > 新しいの項目 > データセット
を追加し
このxsdファイルに TableAdapterを追加
ウィザードで SQLなどを指定
フォームへのデータ表示更新のために 『データ ソース』から追加
といった手順で BindingSource経由にしてみたところ Updateも問題なくいくようです
既存のAdapterクラスのUpdateメソッドに対しての設定が足りないのだろうと思いますが調べきれておりません m(__)m
redfox63さん、回答ありがとうございます。m(_)m
お手数をお掛けしてしまい申し訳ありませんでした。私も色々やってみたのですが、CommandBulider経由でのUpdateは、うまくいきませんでした。もう少しUpdateメソッドについて調べてみようと思います。ありがとうございました。m(_)m
No.3
- 回答日時:
ごめんなさい 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
No.1
- 回答日時:
アクセスのデータを クエリから取得しているのでしょうか?
クエリからでは 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;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- Access(アクセス) access,vbaでフォルダ内のファイルをテーブルにインポート、ファイル名もフィールドに追加したい 1 2022/08/31 11:11
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- MySQL 三科目合計点のクラス別平均点求めるクエリ式を教えてください 1 2023/07/04 09:44
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
- MySQL 下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 第二回模試の3科目の各得点と合 1 2023/04/25 18:02
- MySQL 下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 「名前(first name) 1 2023/06/24 13:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【ASP.NET MVC】一覧編集画面
-
.NET SqlDataReader のレコー...
-
GASでスプレッドシートの一番上...
-
EXCEL2000のマクロ(ADO)にてCSV...
-
Listviewのデータを上から順番...
-
エクセルで指定するセルの範囲...
-
C# データ配列から画像を作成す...
-
【Excel VBA】先頭の「0」飛び...
-
DataGrdViewに関連付けたデータ...
-
DBへの重複更新を防ぐ方法について
-
VBによる可変長ファイルの読み書き
-
MSFlexGridのデータ表示位置の設定
-
特定行の色を変えたい(FlexGrid)
-
エクセルで、絶対値の平均を算...
-
ExcelVBAを使って、値...
-
テキストボックスのvalueとtext...
-
i=cells(Rows.Count, 1)とi=cel...
-
エクセルvbaで、別シートの最下...
-
テキストの文字列検索で、検索...
-
Accessのクエリで、replace関数...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DataGrdViewに関連付けたデータ...
-
【Excel VBA】先頭の「0」飛び...
-
.NET SqlDataReader のレコー...
-
GASでスプレッドシートの一番上...
-
Listviewのデータを上から順番...
-
VBAでページ番号、ページ最終行...
-
MSFlexGridのデータ表示位置の設定
-
GridViewにバインドせずにデー...
-
DataGridViewで表示に制限をつ...
-
【ASP.NET MVC】一覧編集画面
-
VBA ピボットテーブル自動更新
-
ASP C# データベースから1行取得
-
エクセルマクロ小数点桁数
-
GoogleスプレッドシートからExc...
-
VB.net CrystalReportでプロジ...
-
ListViewで条件によって表示を...
-
PHP+CSVを使った一覧表示&詳細...
-
VBによる可変長ファイルの読み書き
-
ACCESSのVBAで[Split]について
-
コンパイルエラーSubまたは...
おすすめ情報