レコードを削除したいのですが、どうもうまく動きません。

解決


超初心者  2009-02-02 13:18:36  No: 141420  IP: 192.*.*.*

立て続けに申し訳ありません。
ListBoxにデータバウンドさせて、レコードをListBoxに表示させて、フォーカスをあたっているレコードを削除させたいとおもいまして、下記のコードを書いてみました。
「削除ボタン」をクリックすると、ListBoxの表示は消えるのですが、実際のレコードは削除されていません。
どのコードが悪いのか、それとも、何か足らないのかわかりませんでしたので、再び、投稿してみました。
ご指導をお願い申し上げます。
VB2008です。

Imports System.Data
Imports System.Data.OleDb
Imports System.Data.SqlClient

Private Sub Button8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button8.Click

        Dim oConn As New System.Data.OleDb.OleDbConnection()
        Dim oCommand As New OleDbCommand()
        Dim oDataAdapter As New OleDbDataAdapter()
        Dim oDataSet As New DataSet()
        Try
            oConn.ConnectionString  = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=c:\dcu\DRS.mdb"

            'コネクションの設定
            oCommand.Connection = oConn

            'DB接続を開く
            oConn.Open()

            'SQL文の設定
            Const strSelect As String = "SELECT * FROM mdata"
            oCommand.CommandText = strSelect

            'データを取得する 
            oDataAdapter.SelectCommand = oCommand
            oDataAdapter.Fill(oDataSet, "mdata")

            Dim cm As CurrencyManager = Me.ListBox2.BindingContext(Me.ListBox2.DataSource)

            Dim dr As DataRow = CType(cm.Current, DataRowView).Row

            dr.Delete()

            Dim oBui As OleDbCommandBuilder = New OleDbCommandBuilder(oDataAdapter)

            'oBui.GetUpdateCommand().CommandText = "SELECT * FROM mdata"

            oDataAdapter.Update(oDataSet, "mdata")

                oConn.Close()

        Catch oExcept As Exception
            '例外が発生した時の処理
            MessageBox.Show(oExcept.Message, "例外発生")

        Finally
            'DB接続を閉じる
            If Not oConn Is Nothing Then
                oConn.Close()
            End If

        End Try

    End Sub

oDataAdapter.Update(oDataSet, "mdata")
でUpdateがきちんとできてないようです。
何か、不足しているのでしょうか?

よろしくお願い申し上げます。

編集 削除
YuO  2009-02-02 13:40:57  No: 141421  IP: 192.*.*.*

drはoDataSet.Tables("mdata")に含まれる行ではないからでしょう。

New DataSet() は新しいDataSetのインスタンスを作成しますし,
異なるのDataSetに含まれる同名のTableは異なるのDataTableですし,
異なるDataTableに含まれる同一の位置に存在するDataRowは異なるDataRowです。


> oDataAdapter.Update(oDataSet, "mdata")
は,drから単に
oDataAdapter.Update(dr.Table)
とすればよいと思います。
当然,SELECTを発行する必要はありません。

編集 削除
超初心者  2009-02-02 20:57:45  No: 141422  IP: 192.*.*.*

YuOさま、お返事ありがとうございます。
早速
oDataAdapter.Update(dr.Table)
と直してデバックをしてみましたが、
「DeleteCommandの動的SQL生成は、キーである列情報を返さないSelectCommandに対してはサポートされていません。」
とのエラーが表示されます。
テーブルmdataの構造ですが、
値が重なってもいいように、Indexキーは設定していませんが、何かIndexをつけなければいけないのでしょうか?

すみません、お願い申し上げます。

編集 削除
超初心者  2009-02-02 23:18:28  No: 141423  IP: 192.*.*.*

mdataに、Indexキーのフィールドを追加しましたところ、上手く削除できました。
ありがとうございました。

編集 削除