DOBON.NET DOBON.NETプログラミング掲示板過去ログ

DB(MSSQL2005)とリストビュー

環境/言語:[環境:VB.NET(Winアプリ)&VS2005&MSSQL2005&WinXP]
分類:[.NET]

@DBには正規化した複数のテーブルを登録してあります。
A5つのリストビューは複数のファイルを1度でドラッグ&ドロップする仕様にしています。
Bドラッグ&ドロップされた複数のファイルのデータはその5つのリストビューを経由して、1つのテーブルの列へ格納するようにしたい。
但し、各リストビューにはファイルのタイプが区別出来る(整理する)ように分けます。

リストビュー1=新規登録用ファイル用(クリックすると、アプリケーションがあけれるようにする)
リストビュー2=雑用ファイル
リストビュー3=PDFファイル
リストビュー4=エクセルファイル
リストビュー5=画像ファイル

C作業手順としては
1】リストビュー1は新規登録用画面からファイルを登録します。
2】新規登録画面用リストビュー1にドラッグ&ドロップしたデータは、作業用画面(別のフォーム)にはリストビュー1〜5がついていて、そのリストビュー1に反映されます。
3】リストビュー2〜5のデータが空ですが、その各リストビューにそれぞれのファイルをドラッグ&ドロップして、同時に更新&削除を行います。

以上のことを作成中ですが、つまづいて悪戦苦闘しているのが、Cの3】です。
各リストビューにドラッグ&ドロップしたデータを同時に更新出来ないのです。
各リストビューのうち、先にドラッグ&ドロップしたリストビューしか反映されず、それ以外のリストビューにドラッグ&ドロップしても出来ません。空振りの状態です。そのフォームを閉じて、DBのデータビューを確認すると、先にドラッグ&ドロップしたリストビューしか反映されておらず、それ以外のリストビューのデータは何も格納されていませんでした。それは1つのリストビューしか登録&更新が出来ないみたいです。しかも、各リストビューの順にドラッグ&ドロップを行うと、DBの並び方(行の位置=以下でいう[登録No]がカウントしてしまう)がずれてしまいます。

|→登録用テーブル←||→   ファイル格納用テーブル   ←|
[ファイルID]-[登録No]-[ファイルタイプ]-[ファイルNo]-[ファイル名]
  1   - 1  - 新規登録    -  1   - 登録ファイル名
  1   - 1  - 雑用       -  1   - 雑用ファイル1
  1   - 1  - 雑用       -  2   - 雑用ファイル2
  1   - 1  - 雑用       -  3   - 雑用ファイル3
  1   - 1  - PDF       -  1   - PDF1
  1   - 1  - PDF       -  2   - PDF2
  1   - 1  - PDF       -  3   - PDF3
  1   - 1  - エクセル     -  1   - エクセル1
  1   - 1  - エクセル     -  2   - エクセル2
  1   - 1  - エクセル     -  3   - エクセル3
  1   - 1  - エクセル     -  4   - エクセル4
  1   - 1  - 画像種類    -  1   - PNG1
  1   - 1  - 画像種類    -  2   - JPG
  1   - 1  - 画像種類    -  3   - GIF
  1   - 1  - 画像種類    -  4   - PNG2

という風に、チャットの入力ボックスに入力して投稿すると、書き込みがすぐ見えるのと同じようにしたい。もちろん、格納しましたという確認メッセージは入れます。この手(同時に更新&削除する処理)はトランザクションを使え!と言われました。実はそれを使うのが初めてなんです。それがVB.NETでの作成にはわからず、困っています。
トランザクション関係ない気がする。。。

登録Noをカウントしてるのも自分のプログラム
なんだろうから、カウントアップしなかったら
いいだけでは?

その上で同じ登録Noの全てのデータ更新を
補償するためにトランザクションでも何でも
使えば良いと思います。

もともとトランザクションはデータベースの
機能でVBの話題ではありません。
VBからはデータベースのトランザクション
機能を利用しているだけです。

トランザクションを利用するVBのサンプルコードは
キーワード検索すればすぐ引っかかる程度の
ものですが、なぜトランザクションが必要
なのか?トランザクション処理を利用すると
どうなるのか?が分かっていないような質問文に
感じました。

その状態で回答をもらっても理解できないと
思うのですが、大丈夫なんですか?
2009/06/12(Fri) 23:02:08 編集(投稿者)
2009/06/12(Fri) 23:01:59 編集(投稿者)

■No24730に返信(るしぇさんの記事)
> トランザクション関係ない気がする。。。

そうですか!?
トランザクションを使えば、同時更新は出来ると聞きました。
そのため、VB作成するときはトランザクションをどう書くかが不明ですが・・・。
トランザクションはロック処理と同じだということは理解していますが、動作は実際確認したことがないので実感がないのです。^_^;
(DBでのロック処理)

> トランザクションを利用するVBのサンプルコードは
> キーワード検索すればすぐ引っかかる程度の
> ものですが、なぜトランザクションが必要なのか?

実際の動作は5つのリストビューにドラッグ&ドロップしたデータをまとめて(同時に)更新しようとすると、1つのリストビュー(先にドラッグ&ドロップしたもの)しかデータが格納できなかったんです。そのため、この場合はトランザクションが必要だと聞いて、サンプルコードなど探しているところです。

>トランザクション処理を利用すると
> どうなるのか?が分かっていないような質問文に
> 感じました。

はい、分かっていないので、質問しています。
今回はさわってみなければ分かりません。

> その状態で回答をもらっても理解できないと
> 思うのですが、大丈夫なんですか?

ですから、5つのリストビューにドラッグ&ドロップしたデータをまとめてDBのテーブルへ格納するコードがVBでは不明ですが、僕のイメージでは更新ボタン用メソッド(そのボタンをクリックすると処理が動く)を作成し、5つのリストビューからそこへ渡して、DBへ格納する処理を入れれば出来るような気がしますが、そのイメージは間違ってますか?
■No24733に返信(アレンさんの記事)
>トランザクション処理を利用すると
>どうなるのか?が分かっていないような質問文に
>感じました。
>
> はい、分かっていないので、質問しています。
> 今回はさわってみなければ分かりません。
>

トランザクション処理は、データの整合性を保つために
使うものです。

例として、自分の銀行口座(10万円)から、商品購入のために
お店の銀行口座(50万円)に3万円を入金処理する場合

1.自分の現時点の口座金額を取得(10万円)

2.自分の口座金額  3万円減額(10-3=7万円)

3.お店の現時点の口座金額を取得(50万円)

4.お店の口座金額  3万円増額(50+3=53万円)


ここで、DBの不具合によって3の処理で失敗した場合
トランザクション処理が無いと、自分の口座金額が
7万円になってしまいます。

失敗したからと同様に繰り返すと、今度は7万円から
3万円を減額して、4万円になってしまいます。

それって困るでしょw

トランザクションは、処理の途中で失敗したら、
トランザクションを開始したところまで処理を戻すことが
出来るのです。
今回の例で言えば、当然1の処理の前にトランザクション開始
処理を追加し、最後にコミットにより処理を確定させます。
途中で失敗した場合は、ロールバックして処理を戻させます。
2009/06/13(Sat) 10:11:40 編集(投稿者)

■No24733に返信(アレンさんの記事)
>サンプルコードなど探しているところです。
メジャーな内容なので
『vb トランザクション』とかのキーワードで
検索できてしまいます。
10分くらいで見つかる話ですが、
今、何をどう調べていますか?

やじゅさんが解説してくれてますが、
データベースのある状態にフラグを立てておいて
そこから順にデータを更新していき、
最後に一連の処理をデータベースに適用するか
フラグの位置まで戻るかの選択をします。

データの更新は1処理ずつ(5つ変更点があるなら
5回)行いますので、更新処理は5つ全てが問題なく
完了することが前提条件です。
つまり1つしかデータが更新されないとか、
[登録No]がカウントしてしまうとかは、
そもそもの更新処理ができてないということであって
トランザクションとは直接関係ありません。

>トランザクションはロック処理と同じだということは理解していますが
何が同じなのか適当に答えている感がします。
今後はどういう点が同じなのかまで書いてください。

単純にデータをロックするという意味なら、
複数の処理を一括管理するトランザクションとは
全く意味が違うのでは?
…ってゆーか同じ意味なら別の言葉使う必要ない
のでは?意味が違うから違う単語が存在するのでは?

>今回はさわってみなければ分かりません。
それは間違ってます。やじゅさんの解説通り、
VBとは全く関係ない説明ができる内容ですので
さわらなくても考え方自体は調べられます。

また、そちらの方が大事な内容になります。

DOBON.NET | プログラミング道 | プログラミング掲示板