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

複数テーブルの一括削除

環境/言語:[WIN 2000 vb.net2003]
分類:[.NET]

開発環境 win 2000 VB.NET 2003

書き込んでのは初めてですが、
このサイト様にはいつもお世話様になっています。
.NETを始めて3週間目になります。宵と申します。
今回、皆様にご教授賜りたいことがあり、書き込みいたしました。
よろしくお願いします。

現在、生産者一括削除 というフォームがあり、
条件入力項目 生産者分類コードで該当コードを選択・入力し、
リストボックスでオーナードローを使って複数行の結果を表示しています。
検索結果表示項目は
『生産者コード・氏名・地域・出荷物』
です。
そして、該当データをリストから選択しフォーム上の一括削除ボタンを押下した時に、
結果が表示されているリストボックスから生産者コードを取り出し、その生産者コードを元に
アクセスデータベース上にある、T_生産者マスタ・T_出荷詳細マスタ・T_生産物マスタの複数テーブル
にある該当データを一括削除を行いたいのですが、
なにか良い方法等がございましたら教えていただけないでしょうか?
一つのテーブルのデータを削除する方法は sql文を使って削除したり、
'選択されている項目を削除
lst_Data.Items.Remove(lst_Data.SelectedItem)というのは分かるのですが、
複数テーブルの一括削除になると、何をどう考えていいのかと・・・悩んでいます。
どなたか、ご教授お願いできませんでしょうか。
2005/10/13(Thu) 21:50:38 編集(投稿者)

お世話になります。

■No13266に返信(宵さんの記事)
> リストボックスでオーナードローを使って複数行の結果を表示しています。
具体的にListBoxにどの様にItemを追加し、表示されているのでしょうか。
教えていただけますか?
DataSourceプロパティに設定して表示していますか?
それとも、DataSet→DataTableを取得してFor文などでループして
アイテムを追加し、表示していますか?

> '選択されている項目を削除
> lst_Data.Items.Remove(lst_Data.SelectedItem)というのは分かるのですが、
これで、DataBase上からも、ちゃんと意図したものが消えていますか?

# 日本語が変だったので修正
お返事ありがとうございます。

> 具体的にListBoxにどの様にItemを追加し、表示されているのでしょうか。
> 教えていただけますか?
> DataSourceプロパティに設定して表示していますか?
> それとも、DataSet→DataTableを取得してFor文などでループして
> アイテムを追加し、表示していますか?
アイテム追加方法としては、


//検索ボタン押下時の処理
'SQLで条件指定
sql = "SELECT 生産者コード,氏名,地域,出荷物 FROM Q_生産 " _
& " WHERE Q_生産.生産者コード ='" & Me.cmd_seisan.Text & "'" & " ORDER BY 生産者コード ASC"

oCommand = New OleDb.OleDbCommand(sql, cn)
oDeReader = oCommand.ExecuteReader

Me.lst_Data.DrawMode = DrawMode.OwnerDrawFixed (オーナードロー)
'データの読込
Do While oDeReader.Read()
ssp = "  |  " 区切り線
no = oDeReader.GetString(0)
SNAME = oDeReader.GetString(1)
chiiki = oDeReader.GetString(2)
hinmoku = oDeReader.GetString(3)
'リストボックスに表示
Me.lst_Data.Items.Add(New MyListItem(no, ssp, SNAME, ssp, chiiki,hinmoku ))
Loop
表示件数の表示
kensu = Me.lst_Data.Items.Count
MsgBox("該当件数:" & kensu & "件 ", MsgBoxStyle.OKOnly + MsgBoxStyle.Information, "一括削除")

-------------------------------------------
|生産者コード|氏名   | 地域  | 出荷物| ←実際は項目名はありません
| ・  |  ・  |  ・ |  |
| 11101 |ああああ |和歌山 |はっさく|
| ・  |  ・  |  ・ | |
------------------------------------------


それで、削除方法ですが、SQLで出来ることが分かったのですが、
アクセスで『連鎖削除』をチェックしているのを忘れていました。。。
すみません。

リストボックスで選択されている項目ではなく、リストボックスに表示されている項目
をすべて一括削除する処理ですので、
ループはレコードの件数が0になるまでまわしたら良いということは分かったのですが、
それを 
『lststr = lst_Data.SelectedItem』のように選択されている項目のアイテムを
取り出し、Me.lst_Data.ValueMember = CInt(lststr.CD)のように
それのCD(生産者コード)を取り出してpCD(型integer)に格納しSQLで削除する
という処理をしていきたいのですが、
どうやって 生産者コードを取り出せばいいのかが分かりません。
選択しないので、『SelectedItem』が使えないので・・・。

//削除ボタン押下したときの処理



Do While kensu > 0
lststr = lst_Data.SelectedItem
Me.lst_Data.ValueMember = CInt(lststr.CD)
pCD = lst_Data.ValueMember
一致するデータを一括削除
sql = sql & " DELETE * FROM T_生産者マスタ"
sql = sql & " WHERE 生産者コード = " & pCD & ";"
oCommand = New OleDb.OleDbCommand(sql, cn)
oCommand.ExecuteNonQuery()

kensu = kensu - 1
Loop
Me.lst_Data.Refresh() (リスト再表示)


//////////////////////////////
Me.lst_Data(リストボックス名)
ただ、全く見当違いのロジックを書いてしまっていたらすみません。

よろしくお願いいたします。
お世話になります。

■No13280に返信(宵さんの記事)
ソースを見せていただいてありがとうございます。
まず…ListBox.ValueMemberの使用方法を誤解されていらっしゃるようなので
以下のURLを参照してみてください。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfSystemWindowsFormsListControlClassValueMemberTopic.asp

それと、MyListItemはご自身で作成されたクラスでしょうか。

以下のコードを書いてみました。(テストしていませんが)
ポイントは、
表示するときに、表示する生産者コードを内部でコレクションで持ち、
Deleteするときに、Delete From Table Field IN ('***', '@@@')
で削除するところです。

ご参考までに…。
===================================================

'ListBoxに表示している生産者コードのコレクション
Private m_Codes As System.Collections.Specialized.StringCollection

'表示ボタン
Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click

  Dim oleConn As System.Data.OleDb.OleDbConnection

  Try
    'DataBaseに接続する
    oleConn = New System.Data.OleDb.OleDbConnection
    oleConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _
          + "Data Source=" + System.IO.Path.Combine(Application.StartupPath, "test.mdb")
    oleConn.Open()

    'Select文を発行する
    Dim selectCommand As System.Data.OleDb.OleDbCommand
    selectCommand = New System.Data.OleDb.OleDbCommand
    selectCommand.CommandText = "SELECT 生産者コード,氏名,地域,出荷物 FROM Q_生産 " _
                  + " WHERE Q_生産.生産者コード ='" + Me.cmd_seisan.Text + "'" _
                  + " ORDER BY 生産者コード ASC"
    selectCommand.Connection = oleConn
    Dim da As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter
    da.SelectCommand = selectCommand
    Dim dt As DataTable = New DataTable
    da.Fill(dt)

    '生産者コードのコレクションをnewする
    Me.m_Codes = New System.Collections.Specialized.StringCollection
    'ListBoxを描画する
    Me.ListBox1.Items.Clear()
    For Each row As DataRow In dt.Rows
      Me.ListBox1.Items.Add(CType(row("生産者コード"), String) _
                 + " | " + _
                 CType(row("氏名"), String))
      '生産者コードのコレクションにAddする
      Me.m_Codes.Add(CType(row("生産者コード"), String))
    Next
    '件数表示
    MessageBox.Show("該当件数は" + Me.m_Codes.Count.ToString() + "件です")

  Catch ex As Exception
    Console.WriteLine(ex.StackTrace)
  Finally
    If Not oleConn Is Nothing Then
      oleConn.Close()
      oleConn.Dispose()
    End If
  End Try

End Sub

'選択しているものを削除ボタン
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

  Dim oleConn As System.Data.OleDb.OleDbConnection
  Try
    'DataBaseに接続する
    oleConn = New System.Data.OleDb.OleDbConnection
    oleConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _
          + "Data Source=" + System.IO.Path.Combine(Application.StartupPath, "test.mdb")
    oleConn.Open()

    'Delete文を発行する
    Dim deleteCommand As System.Data.OleDb.OleDbCommand
    deleteCommand = New System.Data.OleDb.OleDbCommand
    deleteCommand.CommandText = "DELETE FROM Q_生産 " _
                  + " WHERE Q_生産.生産者コード ='" _
                  + Me.m_Codes(Me.ListBox1.SelectedIndex) + "'"
    deleteCommand.Connection = oleConn
    deleteCommand.ExecuteNonQuery()

    '生産者コードのコレクションからremoveする
    Me.m_Codes.RemoveAt(Me.ListBox1.SelectedIndex)
    'ListBoxからRemoveする
    Me.ListBox1.Items.Remove(Me.ListBox1.SelectedItem)
    Me.ListBox1.Refresh()

  Catch ex As Exception
    Console.WriteLine(ex.StackTrace)
  Finally
    If Not oleConn Is Nothing Then
      oleConn.Close()
      oleConn.Dispose()
    End If
  End Try
End Sub

'全てを削除ボタン
Private Sub Button3_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button3.Click
  Dim oleConn As System.Data.OleDb.OleDbConnection
  Try
    'DataBaseに接続する
    oleConn = New System.Data.OleDb.OleDbConnection
    oleConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _
          + "Data Source=" + System.IO.Path.Combine(Application.StartupPath, "test.mdb")
    oleConn.Open()

    'Delete文を発行する
    Dim deleteCommand As System.Data.OleDb.OleDbCommand
    deleteCommand = New System.Data.OleDb.OleDbCommand

    '表示している生産者コードの全てを取得する
    Dim codes As System.Text.StringBuilder = New System.Text.StringBuilder
    For i As Integer = 0 To Me.m_Codes.Count - 1
      If i > 0 Then codes.Append(",")
      codes.Append("'" + Me.m_Codes(i) + "'")
    Next
    deleteCommand.CommandText = "DELETE FROM Q_生産 " _
                  + " WHERE Q_生産.生産者コード IN (" _
                  + codes.ToString() + ")"
    deleteCommand.Connection = oleConn
    deleteCommand.ExecuteNonQuery()

    '生産者コードのコレクションから全てクリアする
    Me.m_Codes.Clear()
    'ListBoxから全てをクリアする
    Me.ListBox1.Items.Clear()
    Me.ListBox1.Refresh()

  Catch ex As Exception
    Console.WriteLine(ex.StackTrace)
  Finally
    If Not oleConn Is Nothing Then
      oleConn.Close()
      oleConn.Dispose()
    End If
  End Try
End Sub
こんにちは。
土日、パソコンを開かなかったので、
お返事が大変遅くなってしまいました。
申し訳ございませんでした。

> まず…ListBox.ValueMemberの使用方法を誤解されていらっしゃるようなので
> 以下のURLを参照してみてください。
> http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfSystemWindowsFormsListControlClassValueMemberTopic.asp
>

ListBox.ValueMember使用方法を大きく勘違いしていたようです。
ご指摘ありがとうございました。

> それと、MyListItemはご自身で作成されたクラスでしょうか。

はい、自分で作成したクラスです。
説明不足ですみませんでした。


サンプルコードありがとうございました!!
別に作って実行させてて頂きました
そしてそれを反映させつつ、実装していきましたら、
問題なく、一括削除を行うことができました。
かなり勉強になりました。
本当に、VB.NETは奥が深いですね。
いつか、なおこ(・∀・) 様のように、人に教えることが出来る
人になりたいです。

丁寧なご教授本当にありがとうございました。
解決済み!

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