Visual Basic 2010 Express
MySQL Connector/Net 5.2.7
MySQL Server 5.5.16
Windows 7 Professional 64Bit
Windows XP 32 Bit でも MySQL Connector/Net 5.0.x で試用
MySqlDataAdapter は、MySqlCommandBuilder GetUpdateCommand() メソッドを呼び出した後、Select ステートメントでゼロ行を返します。エラーはスローされず、更新は成功します。GetUpdateCommand() および Update() 行をコメントアウトすると、Select ステートメントは行を返します。Update() 行をコメントアウトするだけでも問題は残ります。そのため、問題は Update() 自体ではなく、GetUpdateCommand() に関係しています。
接続しているデータベースには 2 つのテーブルがあり、それぞれのスキーマとコンテンツは同じです。
test_table & different_table
id INT 主キー
名 VARCHAR(45)
それぞれに 5 つの行があります:
1 - 名前
2 - 名前
...など
Imports System.Data
Imports MySql.Data.MySqlClient
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'Open Connection to test database'
Dim mscConnection As MySqlConnection
mscConnection = New MySqlConnection()
mscConnection.ConnectionString = "server=localhost; user id=root; password=; database=testdb"
mscConnection.Open()
'Get records from test table'
Dim msdaDataAdapter As MySqlDataAdapter
Dim dsDataSet As New DataSet
msdaDataAdapter = New MySqlDataAdapter("SELECT id, name FROM test_table", mscConnection)
msdaDataAdapter.Fill(dsDataSet, "test_table")
'Show record count (result is 5)'
Console.WriteLine(dsDataSet.Tables("test_table").Rows.Count)
'Loop through rows and change the name field of each one'
For Each row As DataRow In dsDataSet.Tables("test_table").Rows
row("name") = "new name"
Next
'Update altered rows'
Dim mscbCommandBuilder As New MySqlCommandBuilder()
mscbCommandBuilder = New MySqlCommandBuilder(msdaDataAdapter)
mscbCommandBuilder.GetUpdateCommand()
msdaDataAdapter.Update(dsDataSet, "test_table")
'Have tried with and without RefreshSchema/Dispose/Nothing'
mscbCommandBuilder.RefreshSchema()
mscbCommandBuilder.Dispose()
mscbCommandBuilder = Nothing
'Try to Select again'
'Get records from test table'
msdaDataAdapter = New MySqlDataAdapter("SELECT id, name FROM test_table", mscConnection)
msdaDataAdapter.Fill(dsDataSet, "test_table_2")
'Show record count: result is 0 :/'
Console.WriteLine(dsDataSet.Tables("test_table_2").Rows.Count)
'Try a different table'
msdaDataAdapter = New MySqlDataAdapter("SELECT id, name FROM different_test_table", mscConnection)
msdaDataAdapter.Fill(dsDataSet, "different_test_table")
'Show record count: result is 0'
Console.WriteLine(dsDataSet.Tables("different_test_table").Rows.Count)
mscConnection.Close()
mscConnection.Dispose()
End Sub
End Class
コードに添付されているボタンをもう一度クリックすると (アプリを閉じたり再度開いたりせずに)、すべてのSelect ステートメントがゼロ行を返します。
Update() の後、接続が閉じられていません。更新後に接続を (再度) 開こうとすると、接続が既に開いているというエラーが表示されます。
何が起こっているのか誰にも分かりませんか?コードをさらに下まで選択できるように更新するにはどうすればよいですか?