LISTBOXの内容が更新されません

タグの編集
投稿者 VB初心者  (社会人) 投稿日時 2011/7/31 00:11:54
VB初心者です。よろしくお願いします。
visual basic2010expressにて作成してます
担当者の新規・更新のプログラムで テキストBOX(2)・LISTbox(1)・ボタンで構成されてます。
DBを読み込み LISTBOXに表示し
LISTBOXで セレクトされたものを テキストBOXに表示し 修正し
更新処理(DB更新・LISTBOX更新)をします。
新規の場合は テキストBOXに入力し 新規処理(DB追加・LISTBOX更新)をします。

DB更新迄はされるのですが リストボックスに反映されません。
再度 更新ボタンを押下すると 変更後の内容になります。
他で ListBox1.Requery() '再クエリーが必要と教えてもらい
挿入しましたが 'Requery'は system.windows.forms.listboxのメンバーではありません
と出てきてしまいます。 他の記述とかあるんでしょうか?教えてください。

初心者の為 コードが分かりにくいと思いますがよろしくお願いします。

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
'**********リストボックスセット**********
LISTBOX_SET()
End Sub 

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
'**********新規登録**********
'データベース接続用オブジェクト生成
Try
Dim CON As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\TEST.mdb")
'開始
CON.Open()
Dim selectcommand As String = "INSERT INTO tantousya (ta_no, ta_mei) VALUES ('{0}', '{1}' );"
Using cmb As OleDbCommand = New OleDbCommand( String.Format( selectcommand, TextBox1.Text, TextBox2.Text), CON)
cmb.ExecuteNonQuery()
End Using
'**********リストボックスセット**********
LISTBOX_SET()
End Try
End Sub

Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click
End
End Sub

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
'**********変更登録**********
'データベース接続用オブジェクト生成
Try
Dim CON As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\TEST.mdb")
'開始
CON.Open()
Dim selectcommand As String = "UPDATE tantousya SET ta_mei = '{0}' WHERE ta_no = {1};"
Using cmb As OleDbCommand = New OleDbCommand( String.Format(selectcommand, TextBox2.Text, TextBox1.Text), CON)
cmb.ExecuteNonQuery()
End Using     
'**********リストボックスセット**********
LISTBOX_SET()
End Try
End Sub
Private Sub LISTBOX_SET()
'**********リストボックスセット**********
'接続文字列
Dim i As Integer
'データベース接続用オブジェクト生成
Dim con As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\TEST.mdb")
Try
'開始
con.Open()
Dim SQLCom As OleDbCommand = con.CreateCommand
Dim selectcommand As String = "SELECT * FROM tantousya;"
Dim da As OleDbDataAdapter = New OleDbDataAdapter(selectcommand, con)
Dim ds As DataSet = New DataSet()
'データーセット()
da.Fill(ds)
Dim LIST As List(Of String) = New List(Of String)
      For i = 0 To ds.Tables(0).Rows.Count - 1
     LIST.Add(ds.Tables(0).Rows(i)("ta_no") & ds.Tables(0).Rows(i)("ta_mei")
Next
ListBox1.DataSource = LIST ・・・・・・・・・<ここのLISTの内容は変更になってます>・・・
Finally
'データベース終了
con.Close()
End Try
End Sub
Private Sub ListBox1_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles ListBox1.MouseDown

TextBox1.Text = MID(ListBox1.SelectedItem,1,2)
    TextBox2.Text = MID(ListBox1.SelectedItem,3,10)
End Sub
投稿者 shu  (社会人) 投稿日時 2011/8/1 08:51:27
> CON.Open()
> Dim selectcommand As String = "UPDATE tantousya SET ta_mei = '{0}' WHERE ta_no = {1};"
> Using cmb As OleDbCommand = New OleDbCommand( String.Format(selectcommand, TextBox2.Text, TextBox1.Text), CON)
> cmb.ExecuteNonQuery()
> End Using     
> '**********リストボックスセット**********
> LISTBOX_SET()
Connectionをオープンして更新して閉じないでLISTBOX_SETで新しいConnectionを開いて
取得しているので、データを取得しているので反映されていないデータを取得しているのでは
ないでしょうか?自動トランザクションがコミットされていないような感じと思う。閉じてから
LISTBOX_SETを呼ぶか、同じConnectionでデータ取得をすると良いかと思います。
投稿者 VB初心者  (社会人) 投稿日時 2011/8/1 09:58:56
回答ありがとうございます。

Con.Closeは  End Usingを書けば必要ないという事でしたので
CLOSEされていると思うんですが・・・
(con.CLOSEを書くとエラーになります)

LISTBOX_SET()にて DBの更新 ListBox1.DataSource = LISTのLISTの内容は
合ってるんですが LISTBOXの表示のみが上手くいきません。

まだ 本を見ながらの入力ですので 用語を理解していない部分が
ありますので 違う意味ならもう少し詳しく教えていただけないでしょうか

よろしくお願いします。
投稿者 (削除されました)  () 投稿日時 2011/8/1 11:01:58
(削除されました)
投稿者 とくま  (社会人) 投稿日時 2011/8/1 11:25:24
> Con.Closeは  End Usingを書けば必要ないという事でしたので
> CLOSEされていると思うんですが・・・
> (con.CLOSEを書くとエラーになります)
エラーの内容が書かれていないのでそこは言及しませんが、
少なくとも Con は Using の外で宣言され、使用されていますので、
そもそも Using の対象ではないはずです。

Using ステートメント (Visual Basic)
http://msdn.microsoft.com/ja-jp/library/htd05whh(v=VS.100).aspx
resourceexpression があるから参照変数を使っても良いという事を
言っているのであれば、そのように修正してみて下さい。

また、
> Con.Closeは  End Usingを書けば必要ないという事でしたので
なぜ必要ないか理解していますか?

Using ステートメントは自動的に Dispose メソッドを呼び出します。
対象のオブジェクトによっては Dispose メソッドが用意されて
いなかったり、Dispose しても Close してくれない場合がある
事も頭に入れておいて下さい。
結局、信用できない部分は自分で確認していかないと、結果が
想定と違う事など多々ありますので。
# ちゃんとしたデータベースなら、接続ユーザの監視とかできる
# ツールがデータベースについてたりしますが、Access ってどう
# やるのか知らないなぁ。。。
投稿者 VB初心者  (社会人) 投稿日時 2011/8/1 11:40:02
回答ありがとうございます。

> Con.Closeは  End Usingを書けば必要ないという事でしたので
 > CLOSEされていると思うんですが・・・
  ネットを検索して出てきたので 思い込んでしまっていたのですいませんでした

 > (con.CLOSEを書くとエラーになります)
エラー内容は Finallyにて con.Close()を追加すると エラーのなり
内容は、'com'は宣言されていません。アクセス出来ない保護レベルになっています。

 > cmb.ExecuteNonQuery()
 > End Using  
End Usingの後に Con.Closeを記入すればエラーが起こりませんでした。
LISTBOXの内容も変更されました

どのようにしていいのか まったく見当も付かなかった為助かりました。
どうもありがとうございました。
投稿者 とくま  (社会人) 投稿日時 2011/8/4 10:30:06
閉じてるので問題ないけど、マルチポスト報告
http://qanda.rakuten.ne.jp/qa6908290.html

余談。
> > (con.CLOSEを書くとエラーになります)
>エラー内容は Finallyにて con.Close()を追加すると エラーのなり
>内容は、'com'は宣言されていません。アクセス出来ない保護レベルになっています。
それただの文法エラー。変数が見つからない(どこにあるのか分からない)
と言っているだけです。
綴りが間違ってても同じエラーになるので'com'なのは不味いんだけど、
Finally でエラーになるのは Try の内側で変数宣言しているからです。

LISTBOX_SET() のように Try の外側で宣言して下さい。変数のスコープ
(有効範囲)の問題です。
※初期化時のエラートラップを考慮しての事であれば、宣言のみ外出し
 にして、初期化の命令のみ Try の内側へ入れます。
        '変数宣言 
        Dim con As OleDbConnection
        Try
            'データベース接続用オブジェクト生成 
            con = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\TEST.mdb")