- - PR -
VB.NET データを削除しきれません。
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2003-03-19 13:51
こんにちわ。
VB.NETにてWindouwsアプリケーションの開発をしています。 データベースの内容をフォームから削除しようとしているのですがうまくいきません。 DBにはMSAccessを仕様しています。 フォーム内容 OleDbDataAdapter OleDbDataConnection DataSet TextBox*2 Button*3 以上のコントロールをフォームに配置しております。 フォームロード時にはデータを抽出して読み込み、テキストボックスにそれぞれのデータを出力させています。 カレントのレコードを移動する場合にはボタンで「前」「次」として移動可能にしてあります。 問題の削除部分なのですが、テキストボックスに表示されてるデータのカレント行を削除。という処理をしようとしています。 データセット上では削除されてるのですが、MDBファイルにはデータが残ったままで更新が反映されていません。 以下コードなのですが、更新の仕方に問題があるのでしょうか? =============================================================================== Dim r As DataRow Dim dLgRet As DialogResult r = DS_DGrid1.Tables("DGrid").Rows.Find(TextBox1.Text) If Not r Is Nothing Then MessageBox.Show("「" & r("Name").ToString() & "」を削除します") DS_DGrid1.Tables("DGrid").Rows.Remove(r) 'データ削除 OleDbDataAdapter1.Update(DS_DGrid1, "DGrid") 'データ更新 Else MessageBox.Show("削除するレコードが見つかりません。") Return End If =============================================================================== お解りの方がいればご教授お願いします。 |
|
投稿日時: 2003-03-19 17:50
ドキュメントに書いてあるとおり、DataRowCollection.Removeメソッドを呼び出すことは、DataRow.Deleteを呼び出してAcceptChangesを呼び出すのと同じだからです。
DataRow.Deleteだけを行うようにしましょう。 [ メッセージ編集済み 編集者: NothingBut.NETFX 編集日時 2003-03-19 17:51 ] |
|
投稿日時: 2003-03-20 11:11
返信ありがとうございます。
いまいちデータアクセスについて理解が乏しいようなのでそのあたりから学習しなおしてみようと思います。 また、ついでの質問で申し訳ないんですが、.NETのデータアクセス方法についてお聞きしたいです。 自分で調べた結果、.NETでのデータアクセス方法はDataSetを使用する場合が定番のように思えますが、複数で同じデータを扱う場合に以下のようなトラブルはどうなってしまうのでしょうか? 環境:サーバー兼サーバー1台。クライアント1台。ピアツーピア接続 クライアントにおいてサーバーのデータを更新しているときに、同じようにクライアント兼サーバーにおいても同じデータで同時に作業していたとします。 このとき作業されるデータはデータアダプタとデータセットによって抽出された元データのコピーだと思うのですが、作業後にその更新が元データに反映される場合にそれぞれ違ったコピーを元データに送ってしまうことになると思うのですが・・・。 説明ヘタですいません;; 図っぽくしてみます クライアント側処理 サーバー兼クライアント処理 データ接続 データ接続 ↓ ↓ データセットに抽出 データセットに抽出 ↓ ↓ データ切断 データ切断 ↓ ↓ データにAAという値を追加 データの一部を削除 ↓ ↓ データ接続 データ接続 ↓ ↓ データセットの内容を更新 データセットの内容を更新 ↓ ↓ データ切断 データ切断 ↓ ↓ データが更新された。 データが更新された。 というように扱うデータが同じものとして、同時に違った処理ができてしまうように思っているのですが、それはできないのか、あるいはできてしまう場合データはどのようになってしまうのか知りたいです。 コンマ何秒かの差で遅れて更新されたデータを優先して上書きとなるのでしょうか? |
|
投稿日時: 2003-03-24 11:24
こんにちわ。
NothingBut.NETFXさんのアドバイスにより、なんとか解決できました。 ありがとうございました。 Removeについて勘違いしていたみたいでした。 以下のようにしてDeleteを使うことで解決しました。 =============================================================================== DS_DGrid1.Tables("DGrid").Rows(0).Delete() =============================================================================== 続けて質問したいのですが、上記のコードはテーブルの一番上の行(0行目)を削除するというコードなのですが これを「含まれる文字列」あるいは「含まれる数値」を削除。とするにはどうすればいいのでしょうか? |
|
投稿日時: 2003-03-24 11:56
同時実行制御に関してはここを参照すると良いでしょう。
キーワードは「楽観的(オプティミスティック)」です。 (別の話題は別にスレッドを立てた方が良いと思いますが) http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vbcon/html/vboridataupdatesconcurrency.asp >「含まれる文字列」あるいは「含まれる数値」を削除 行を削除でなく、文字列や数字を削除・・・ですか? 行のある列の値を変更するということですかね? |
|
投稿日時: 2003-03-24 12:08
一郎さんありがとうございます。
>(別の話題は別にスレッドを立てた方が良いと思いますが) そうですね^^; 考えたんですが、未解決なことがあるのにまたスレッド立てるのも気がひけて・・・ でも、気になってしまったので書いてしまいました。以後気をつけます。 >行を削除でなく、文字列や数字を削除・・・ですか? >行のある列の値を変更するということですかね? ええと、書き込み方が悪かったですね^^; 「該当の数値(文字列)が含まれる行全て削除」 ということがしたいのです。 DataGridを使う場合は DStest1.Tables("DGrid").Rows(DataGrid1.CurrentCell.RowNumber).Delete() としてクリックしてカレントになった行を削除としていたのですが DataGridを使わない場合に該当の行を削除したいのです。 |
|
投稿日時: 2003-03-24 16:11
うーん、DataRowCollectionクラスはIEnumerableインターフェイスを(間接的に)実装していますので、ForEachで端から見ていく・・・とか。
残念ながら、私にはそれくらいしか思いつきません。 |
|
投稿日時: 2003-03-24 17:56
一郎さん、ありがとうございました。
とりあえず、スレッドのタイトルである質問に関しては解決したということで このスレッドは終わりにします。 ありがとうございました^^ |
1