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

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

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

Re[7]: リストボックスの全アイテムをテーブルと差分を取り更新


(過去ログ 21 を表示中)

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

■8996 / inTopicNo.1)  リストボックスの全アイテムをテーブルと差分を取り更新
  
□投稿者/ みこ (12回)-(2007/10/16(Tue) 02:40:48)

分類:[C#] 

いつも教えていただきありがとうございます。

C#で開発しています。 環境はVS2005、Access2007(mdb)、Windows XPです。

DBには複数のテーブルがあり、1つは全商品リスト、残りは店舗別商品リスト(店舗ごとに1テーブル)です。
Windows Formに2つのlistboxを用意し、
 ■片方には店舗別商品リストのデータ(1テーブル分)をすべて表示、
 ■もう一つには全リストと表示した店舗別商品リストの差分をselectコマンドでDataSetに取り込み、それを表示しています。

この状態からlistboxの内容を操作し(相互に移動可能とし)、その結果を店舗別商品リストに追加・削除したいのですが、listboxの内容の保存についてのやり方がわかりません。

一旦テーブルの内容を削除し全部追加することも考えたのですが、当画面で商品リストを編集後、各レコードにデータを追加するため、もともとあるレコードはそのままで、差分だけを更新(追加/削除)したいのです。
更新するのは店舗別商品リストだけで、全リストはそのままです。
listboxの内容を操作した結果をDBに保存したいのでdatasetの内容ではありません。

listboxに設定したValueMemberとDisplayMemberの2項目がDBに追加できれば問題ありません。
追加は、効率が悪いかも知れませんが1件ずつ取得してテーブルから一致する項目を探してなければ追加でいけるかもしれませんが、これだとDisplayMemberしか取得する方法がわからないのと、リストから外されたものの削除ができません。

わかりづらい説明で申し訳ありませんが、よろしくお願いします。

引用返信 編集キー/
■8998 / inTopicNo.2)  Re[1]: リストボックスの全アイテムをテーブルと差分を取り更新
□投稿者/ Jitta on the way (24回)-(2007/10/16(Tue) 07:32:14)
No8996 (みこ さん) に返信

データバインド という機能について、調べてみましょう。

DataTableを直接ListBoxにバインドして、TableAdapterで更新をかけます。
引用返信 編集キー/
■9034 / inTopicNo.3)  Re[2]: リストボックスの全アイテムをテーブルと差分を取り更新
□投稿者/ みこ (13回)-(2007/10/17(Wed) 06:00:13)
No8998 (Jitta on the way さん) に返信

ありがとうございます。
当初、dataAdapterでのUpdateを考えたのですが、上記のように条件によってことなる処理はできないと思い、悩んでいるところです。
更新部分は
 ・データにもありDBにもあるレコードはそのまま
 ・データにありDBにないレコードはDBに新規追加
 ・データになくDBにあるレコードはDBから削除

としたいのです。
例えば、listbox上で操作されてa,b,c,e,gというアイテムがあり、DBにはa,b,d,gがあるとすると、DBに対してc,eの追加、dの削除を行いたいのです。
ですので1件ごとに処理をしなければならないのでは?と思ったのですが、そうではないのでしょうか?
上記のようなことをやりたい場合でもAdapterのInsertやDeleteコマンドで実現できますでしょうか?
何か考え方が間違っているのでしょうか?
改めてデータバインドについて調べてみましたが、listboxのDataSourceに指定したテーブルに対して全部を一括でInsertやUpdateすることしかできないと認識しています。

よろしくお願いします。
引用返信 編集キー/
■9035 / inTopicNo.4)  Re[3]: リストボックスの全アイテムをテーブルと差分を取り更新
□投稿者/ Jitta on the way (26回)-(2007/10/17(Wed) 07:22:46)
うーん、そう思うから、なのか...

DataSetは、簡易データベースと考えてください。簡易データベースに対して行った変更は、そのままバックエンドのデータベースに対して行われます。

とりあえず、ADO.NETについて調べてみてください。MSDN ライブラリにも、「ADO.NET での開発」のようなトピックがあります。
引用返信 編集キー/
■9038 / inTopicNo.5)  Re[3]: リストボックスの全アイテムをテーブルと差分を取り更新
□投稿者/ 魔界の仮面弁士 (474回)-(2007/10/17(Wed) 09:23:42)
No9034 (みこ さん) に返信
> ですので1件ごとに処理をしなければならないのでは?と思ったのですが、そうではないのでしょうか?

いえ。それらの処理は、Adapter 側で自動的に処理させることができます。


DataSet(というよりも、その中のDataTable)に登録された行(DataRow)は、
それぞれ、RowState という「状態」を持っています。

その状態が Unchanged なら「変更なし」、Modified で「修正あり」、Added は「追加」、Deleted が「削除」です。
それぞれについて、編集前の値を得る事も、編集後の値を得ることもできます。(DataRowVersion)


そして DataAdapter/TableAdapter の Update では、各行の RowState を基に、自動的に
INSERT / UPDATE / DELETE の SQL コマンドを発行してくれます。

この SQL とは、Adapter 側の InsertCommand / UpdateCommand / DeleteCommand プロパティです。
これらのコマンド設定次第で、悲観的更新も楽観的更新も可能となっています。
# 悲観的…編集対象の行が、既に他のユーザによって編集済みの場合、更新失敗として扱う。
# 楽観的…他のユーザによる編集結果を無視して、後書き優先として扱う。

[行の状態とバージョン]
http://msdn2.microsoft.com/ja-jp/library/ww3k31w0%28VS.80%29.aspx

[コマンドの自動生成] - [更新および削除のオプティミスティック同時実行制御]
http://msdn2.microsoft.com/ja-jp/library/tf579hcz%28VS.80%29.aspx
引用返信 編集キー/
■9083 / inTopicNo.6)  Re[4]: リストボックスの全アイテムをテーブルと差分を取り更新
□投稿者/ みこ (14回)-(2007/10/18(Thu) 14:38:48)
No9035 (Jitta on the way さん) に返信

ありがとうございます。あらためてADO.Netについて調べてみます。

引用返信 編集キー/
■9084 / inTopicNo.7)  Re[4]: リストボックスの全アイテムをテーブルと差分を取り更新
□投稿者/ みこ (15回)-(2007/10/18(Thu) 14:53:32)
No9038 (魔界の仮面弁士 さん) に返信

ありがとうございます。
DataAdapterのInsert/Update/Deleteの各コマンドのSQL文にRowStateで判断する条件を追加しておかなくても、勝手に判断されてDataAdapter.Updateで一気に処理されるということですね?
例えば、
 insert ←「RowStateがAdded」の行に対して実行されるSQL
 update ←「RowStateがModified」の行に対して実行されるSQL
 delete ←「RowStateがDeleted」の行に対して実行されるSQL

という認識であっていますでしょうか?


引用返信 編集キー/
■9104 / inTopicNo.8)  Re[5]: リストボックスの全アイテムをテーブルと差分を取り更新
□投稿者/ みこ (16回)-(2007/10/18(Thu) 21:01:59)
上記の内容でいろいろ調べてみたのですが、更新条件がこのRowStateだけなのです。
これを判断してinsert/deleteを行うのですが、この場合where句に何を書いていいのか分からず・・・

listboxに追加されたらその名称(DisplayMember)とId(ValueMember)をDBに追加/削除するので、ほかに条件がないのです。
このIdはDBでkeyとして使用します。

具体的にどのようにすればいいかという例がのっているサイト等も見つけられず困っています。
where句にこの「RowStateがAdded」といったような記述をしてよいのでしょうか?

理解不足なだけで上記は基本なのかもしれませんが、なにとぞ教えていただけますようお願いします。
引用返信 編集キー/
■9108 / inTopicNo.9)  Re[6]: リストボックスの全アイテムをテーブルと差分を取り更新
□投稿者/ 魔界の仮面弁士 (479回)-(2007/10/18(Thu) 23:52:29)
2007/10/18(Thu) 23:53:22 編集(投稿者)

No9104 (みこ さん) に返信
> 上記の内容でいろいろ調べてみたのですが、更新条件がこのRowStateだけなのです。
> これを判断してinsert/deleteを行うのですが、この場合where句に何を書いていいのか分からず・・・

まずは、デザイナから TableAdapter を作ってみてください。
ウィザードに答えていけば、必要な SQL 文が自動的に生成されますので、
まずは、そこから始めてみてはいかがでしょう。
http://msdn2.microsoft.com/ja-jp/library/7zt3ycf2%28VS.80%29.aspx
http://www.microsoft.com/japan/msdn/thisweek/step7/VS2005_DA/DataTierDevelopment/DataAccessComponent.aspx

ウィザードの途中で、排他制御を悲観的(ペシミスティック)にするか、
楽観的(オプティミスティック)にするかも選べるので、それぞれ、
どのような SQL (および、パラメータ指定)が生成されるのか見比べると、
仕組みが分かってくるかも。
引用返信 編集キー/
■9209 / inTopicNo.10)  Re[7]: リストボックスの全アイテムをテーブルと差分を取り更新
□投稿者/ みこ (17回)-(2007/10/22(Mon) 00:37:53)
ありがとうございました。

教えていただいた手順で試行錯誤を重ね、やりたいことが実現できました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -