我是.NET编程的新手。我试图检查数据库表中是否有设置,如果没有,请创建一些默认设置。问题是,当没有设置时,我需要使用datareader进行两次调用,并且它一直给我带来问题。
我最初只使用一个datareader,但是两个试图解决我的问题,但是没有用 然后我尝试关闭datareader,我得到错误,因为它返回了一个null引用。
如果我尝试关闭它,我会遇到问题,如果我不关闭它,下一个会给我一个错误,说明此连接上已经有一个需要关闭的开放式数据加载器。任何人都可以告诉我如何重构我的代码以使其工作(最好有一个datareader)?
我也尝试将reader.close()放在另一组try catch中,这样我就可以捕获错误,但仍然没有关闭datareader,所以我不知所措。
Private Sub Get_Initial_Settings()
Dim reader1 As MySqlDataReader = Nothing, reader2 As MySqlDataReader = Nothing
Dim cmd As New MySqlCommand("SELECT depot, size, roc_family, wil_family, ast_family, met_family, ric_family, view FROM vb_dashboard.user_preferences WHERE " & GetUserName() & "", conn)
Dim hasSettings As Boolean
'Get Personal Settings or initiate them if necessary
Try
reader1 = cmd.ExecuteReader
hasSettings = True
MessageBox.Show("Your user settings show you have a selected depot of " & reader1(0).ToString)
Catch ex As Exception
'No settings exist, set some up
MessageBox.Show("You have no settings for this program yet")
hasSettings = False
Finally
reader1.Close()
End Try
'User has no preferences, Create some
'First, create a list of depots to select from and add it to a combobox
If (hasSettings = False) Then
Try
cmd.CommandText = "SELECT depot FROM vb_dashboard.depots ORDER BY depot"
reader2 = cmd.ExecuteReader
While (reader2.Read)
dlgSelectDepot.cbDepotSelect.Items.Add(reader2.GetString(0))
End While
'Now show the dialog box to initiate a depot setting
Me.Hide()
dlgSelectDepot.Show()
Me.Show()
If (dlgSelectDepot.DialogResult = Windows.Forms.DialogResult.Cancel) Then
Me.Close()
End If
cmd.CommandText = "INSERT INTO vb_database.user_preferences SET user='" & GetUserName.ToUpper & "', depot='Rochester'"
cmd.ExecuteNonQuery()
Catch ex As Exception
MessageBox.Show("An error has occurred: " & ex.Message)
Finally
reader2.Close()
End Try
End If
End Sub
答案 0 :(得分:0)
您正在重复使用cmd
对象。实际上,您将每个阅读器设置为与命令对象相同的连接。您应该创建2个不同的命令对象,这些命令对象具有自己的数据库连接。
另一种选择是从第一个数据读取器获取所需信息并存储在数据表中(使用MySqlDataAdapter)。如果该信息不可用,请关闭该连接,使用新的命令对象创建一个新连接。这可能是我要去的方向。
修改强>
你真的需要使用New SqlConnection()
并让操作系统处理它。
答案 1 :(得分:0)
问题在于你的第二个尝试块,你正在执行一个仍然有一个打开的阅读器的命令。我使用使用块来帮助他们保持笔直,例如:
Using cn As new DbConnection(connectionString)
cn.Open()
Using cmd As DbCommand = cn.CreateCommand()
'first command
cmd.CommandText = "SELECT depot FROM vb_dashboard.depots ORDER BY depot"
Using dr As DbDataReader = cmd.ExecuteReader()
While dr.Read()
dlgSelectDepot.cbDepotSelect.Items.Add(reader2.GetString(0))
End While
dr.Close()
End Using
'
'next command
cmd.CommandText = "INSERT INTO vb_database.user_preferences SET user='" & GetUserName.ToUpper & "', depot='Rochester'"
cmd.ExecuteNonQuery()
End Using
cn.Close()
End Using
答案 2 :(得分:0)
我认为问题在于您有两个潜在的问题原因,并且只能使用您正在使用的代码类型一次解决一个问题。以下是两种可能性:
使用您目前拥有的代码,我认为您已解决了问题#2,但重新引入了问题编号1.如果尚未存在用户设置,则永远不会创建datareader,因为执行命令时出现故障。因此,当您尝试关闭datareader时,会出现错误。当代码没有关闭datareader时,你解决了问题#1,但没有解决问题#2。我认为有几种更好的方法可以解决这个问题: