C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 変更したDataSetの内容をMDBに更新するには?


(過去ログ 68 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■39606 / inTopicNo.1)  変更したDataSetの内容をMDBに更新するには?
  
□投稿者/ まぐねしうむ (72回)-(2009/08/11(Tue) 14:55:02)

分類:[.NET 全般] 

DataSetの内容をMDBに更新するには?

環境C# Vs2005 SP2 Access2003(MDB)


SELECTで取得したMDBの内容をDataSetに展開し
DataSet上で変更した物を再度、MDBに更新しようとしているのですが
なぜか、MDB側に変更されません。

DataSetの中身は変更されているので、DB更新がうまく動いていないと
思うのですが何がいけないのでしょうか?

◆書いたコード

DataSet ds = new DataSet();
string UserID = "Admin";
string sqlConn = "Provider=\"Microsoft.Jet.OLEDB.4.0\";";
sqlConn += sqlConn + "Data Source=\"" +
DbFileName + "\";" +
"User ID=" + UserID + ";" +
"Jet OLEDB:Database Password=" + passWd;

using (OleDbConnection oleDbCon = new OleDbConnection(sqlConn))
{
OleDbDataAdapter adapter = null;
OleDbCommandBuilder cmd = null;
DataRow dr = null;
try
{
using (adapter = new OleDbDataAdapter(sql, sqlConn))
{
//抽出
adapter.FillSchema(ds, SchemaType.Source, TableName);
adapter.Fill(ds, TableName);


//フラグを全てFalseで初期化する
for (int i = 0; i < ds.Tables[TableName].Rows.Count; i++)
{
//dr = ds.Tables[TableName].Rows[i];
//dr.BeginEdit();
//dr["sel"] = false;
//dr.EndEdit();
//dr.AcceptChanges();

ds.Tables[TableName].Rows[i]["sel"] = false;
}

//変更を確定
ds.AcceptChanges();

//DB更新用
cmd = new OleDbCommandBuilder(adapter);

//DBを更新 ★ここがうまく動いていない?
//adapter.Fill(ds);
//adapter.Update(ds, TableName);
adapter.Update(ds, ds.Tables[TableName].TableName);
blResult = true;

Form1 frm1 = new Form1(ds);★ここで確認すると期待通り変更されているので
frm1.ShowDialog();      Datasetは変更されている?
}
}
catch (OleDbException Oex)
{

}
finally
{
if (ds != null)
{
ds.Dispose();
ds = null;
}
if(cmd!=null)
{
cmd.Dispose();
}
if (adapter != null)
{
adapter.Dispose();
}
if (oleDbCon != null)
{
oleDbCon.Close();
oleDbCon.Dispose();
}
}
}

引用返信 編集キー/
■39608 / inTopicNo.2)  Re[1]: 変更したDataSetの内容をMDBに更新するには?
□投稿者/ 魔界の仮面弁士 (1193回)-(2009/08/11(Tue) 15:20:43)
No39606 (まぐねしうむ さん) に返信
> SELECTで取得したMDBの内容をDataSetに展開し
> DataSet上で変更した物を再度、MDBに更新しようとしているのですが
> なぜか、MDB側に変更されません。

その mdb は、ソリューション内に含めてある物ですか? それとも別管理ですか?

ソリューションに含めてある場合、プロパティ ウィンドウの
[ビルド アクション]および[出力ディレクトリにコピー]の設定によっては、
コンパイル時に、更新前の mdb で上書きされる事があるので、気をつけてください。


> DataSetの中身は変更されているので、DB更新がうまく動いていないと
> 思うのですが何がいけないのでしょうか?
SQL 内に、更新に必要な「主キー」情報が含まれていますか?


> //フラグを全てFalseで初期化する
> for (int i = 0; i < ds.Tables[TableName].Rows.Count; i++)
> {
>      ds.Tables[TableName].Rows[i]["sel"] = false;
> }
この場合には、
  foreach (DataRow row in ds.Tables[TableName].Rows)
  {
       row["sel"] = false;
  }
とした方が、スッキリ書けますよ。


> //DB更新用
> cmd = new OleDbCommandBuilder(adapter);
この後で、adapter.UpdateCommand の内容を確認してみてください。
(特に、CommandText の内容と、個々のParametersの OleDbType / DbType)

引用返信 編集キー/
■39609 / inTopicNo.3)  Re[1]: 変更したDataSetの内容をMDBに更新するには?
□投稿者/ もりお (33回)-(2009/08/11(Tue) 15:25:01)
No39606 (まぐねしうむ さん) に返信
> //変更を確定
> ds.AcceptChanges();
変更フラグが消されるんじゃないかしら。
引用返信 編集キー/
■39611 / inTopicNo.4)  Re[2]: 変更したDataSetの内容をMDBに更新するには?
□投稿者/ まぐねしうむ (73回)-(2009/08/11(Tue) 15:30:11)
お返事ありがとうございます。

> その mdb は、ソリューション内に含めてある物ですか? それとも別管理ですか?
別管理になります。

> ソリューションに含めてある場合、プロパティ ウィンドウの
> [ビルド アクション]および[出力ディレクトリにコピー]の設定によっては、
> コンパイル時に、更新前の mdb で上書きされる事があるので、気をつけてください。
ありがとうございます。
昔同じ間違いをしたので大丈夫です。

> SQL 内に、更新に必要な「主キー」情報が含まれていますか?
ご指摘のとおり、設定されていませんでした。

cmd = new OleDbCommandBuilder(adapter);
object obj =cmd.GetUpdateCommand();<=を追加して実行してみたところ
                   見事に例外が発生しました。

> この場合には、
> foreach (DataRow row in ds.Tables[TableName].Rows)
> {
> row["sel"] = false;
> }
> とした方が、スッキリ書けますよ。
ですね。

>>//DB更新用
>>cmd = new OleDbCommandBuilder(adapter);
> この後で、adapter.UpdateCommand の内容を確認してみてください。
> (特に、CommandText の内容と、個々のParametersの OleDbType / DbType)
CommandTextはNullでした。
MDBの中を見てみたところ、テーブルに対してSELECTしているのでは無く
クエリに対してSELECTを実行していました。

そこで質問の内容がコード異なってしまうのですが、
今回の主キーが無い場合にDataSetを更新する方法はあるのでしょうか?
DB側を変更する事が困難なので良い方法があれば教えてください。

よろしくお願いします。

引用返信 編集キー/
■39613 / inTopicNo.5)  Re[3]: 変更したDataSetの内容をMDBに更新するには?
□投稿者/ 魔界の仮面弁士 (1194回)-(2009/08/11(Tue) 15:35:53)
No39609 (もりお さん) に返信
>> //変更を確定
>> ds.AcceptChanges();
> 変更フラグが消されるんじゃないかしら。
おぉう。見落としていました。
これだと、たとえ主キーがあったとしても、更新対象とはなりませんね。


No39611 (まぐねしうむ さん) に返信
> 今回の主キーが無い場合にDataSetを更新する方法はあるのでしょうか?
> DB側を変更する事が困難なので良い方法があれば教えてください。
相手がクエリ/VIEW となると、更新に必要な情報が得られないかも知れませんが、
その場合は、UpdateCommand を手動で設定すれば OK かと思います。
(必要であれば、Insert/DeleteCommand も)

あるいは型付き DataSet にして、TableAdapter 経由で更新するのも手です。
引用返信 編集キー/
■39618 / inTopicNo.6)  Re[2]: 変更したDataSetの内容をMDBに更新するには?
□投稿者/ やじゅ (1206回)-(2009/08/11(Tue) 16:06:08)
やじゅ さんの Web サイト
> ■No39606 (まぐねしうむ さん) に返信

>> //変更を確定
>> ds.AcceptChanges();
> 変更フラグが消されるんじゃないかしら。

補足事項:
 AccetpChangesを実行するとDataTableのレコードの変更履歴がリセットされますので
 DataAdapterのUpdateメソッドでDataTableがデータベースに反映されません。
 つまり、DataTableをなにも変更していない状態になります。
 よって、Updateの前にAcceptChanges()は不要です。

 なお、DataAdapterのUpdate メソッドが、渡されたデータセットのAcceptChangesを
 暗黙的に呼び出すようになっています。
 これにより変更された各セルの元の値と現在の値とが再同期されます。
引用返信 編集キー/
■39621 / inTopicNo.7)  Re[4]: 変更したDataSetの内容をMDBに更新するには?
□投稿者/ まぐねしうむ (74回)-(2009/08/11(Tue) 16:22:56)
> ■No39609 (もりお さん) に返信
       やじゅ さん
ありがとうございます。

> ■No39611 (まぐねしうむ さん) に返信
> 相手がクエリ/VIEW となると、更新に必要な情報が得られないかも知れませんが、
ためしに、ご指摘いただいた箇所を削除してみましたが
「UpdateCommand の動的 SQL 生成は、キーである列情報を返さない
 SelectCommand に対してはサポートされていません。」

が発生してしまいますので、手動などで調整する必要がありそうです。

> その場合は、UpdateCommand を手動で設定すれば OK かと思います。
> (必要であれば、Insert/DeleteCommand も)
>
> あるいは型付き DataSet にして、TableAdapter 経由で更新するのも手です。
手動でUpdateCommand を作成すると、今後DB側が変更になった場合にコードの修正が
入ると思うので(もしかしたら違う?)、型付き DataSetで行いたいと思うのですが
「C# 型付き DataSet 作成」等で検索してみましたが、コードで作成する方法が見つかりません。
よろしければ説明しているHPを教えていただけないでしょうか?


引用返信 編集キー/
■39623 / inTopicNo.8)  Re[5]: 変更したDataSetの内容をMDBに更新するには?
□投稿者/ やじゅ (1207回)-(2009/08/11(Tue) 16:47:15)
やじゅ さんの Web サイト
No39621 (まぐねしうむ さん) に返信
> 型付き DataSetで行いたいと思うのですが
> 「C# 型付き DataSet 作成」等で検索してみましたが、コードで作成する方法が見つかりません。
> よろしければ説明しているHPを教えていただけないでしょうか?
>

型付きデータセット作成 xsdファイル
http://naoko.wankuma.com/beginner/beginner_0007_winDbApp01.html
http://www.atmarkit.co.jp/fdotnet/bookpreview/vs2005webapp_07/vs2005webapp_07_03.html
引用返信 編集キー/
■39626 / inTopicNo.9)  Re[6]: 変更したDataSetの内容をMDBに更新するには?
□投稿者/ まぐねしうむ (75回)-(2009/08/11(Tue) 17:35:16)
No39623 (やじゅ さん) に返信
HPの提示ありがとうございます。
提示していただいたHPを簡単にですが、確認させていただきました。
ありがとうございます。

そこで、質問なのですが提示していただいたHPはVS上にDBを取り込んでいると思います。
正式な名称を知らないのですが 魔界の仮面弁士さんがNo39608 でおっしゃっている
「ソリューション内」に含む方法でやっている方法あっていますか?

今回作成しているケースでは、別管理(ソリューションに含まない)方法で行う等考えておりますが
型付Datasetの場合=ソリューションに含む方法になるのでしょうか?

仮にそうなると、やはりUpdateCommand を手動で実装することになるのでしょうか?
質問ばかりで申し訳ありませんがよろしくお願いします。
引用返信 編集キー/
■39627 / inTopicNo.10)  Re[7]: 変更したDataSetの内容をMDBに更新するには?
□投稿者/ 魔界の仮面弁士 (1197回)-(2009/08/11(Tue) 17:46:30)
No39626 (まぐねしうむ さん) に返信
> 今回作成しているケースでは、別管理(ソリューションに含まない)方法で行う等考えておりますが
> 型付Datasetの場合=ソリューションに含む方法になるのでしょうか?
データベース自体をソリューションに含める必要はありません。先に紹介のあった
>> http://naoko.wankuma.com/beginner/beginner_0007_winDbApp01.html
にしても、サーバー エクスプローラ上から参照しているだけであって、
データベース本体をソリューションに含めている訳ではありません。


ただし、型付DataSetを生成するために、対象データベースへの接続文字列が要求されます。
もし、実行時の接続文字列と開発時の接続文字列が異なる場合には、
事前に接続文字列を変更しておいてください。


> 仮にそうなると、やはりUpdateCommand を手動で実装することになるのでしょうか?
型付DataSet(に含まれる TableAdapter)で制御する場合であっても、
どのような UpdateCommand が生成されるのかは、事前に確認しておいた方が良いかと。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -