处理OpenDataReader错误的最佳方法(vb.net和mysql)
我的项目运行在VS 2013和MySQL上,我将公共变量conn声明为mysqlconnection,并且在整个项目中使用相同的连接来执行任何数据库操作处理OpenDataReader错误的最佳方法(vb.net和mysql),vb.net,mysqldatareader,Vb.net,Mysqldatareader,我的项目运行在VS 2013和MySQL上,我将公共变量conn声明为mysqlconnection,并且在整个项目中使用相同的连接来执行任何数据库操作 Public conn As New MySqlConnection Public Sub createConnection() If conn.State = ConnectionState.Closed Then conn.ConnectionString = pa
Public conn As New MySqlConnection
Public Sub createConnection()
If conn.State = ConnectionState.Closed Then
conn.ConnectionString = parseConfigXML()
conn.Open()
End If
End Sub
Public Function parseConfigXML()
Try
Dim m_xmld As XmlDocument
Dim m_nodelist As XmlNodeList
Dim m_node As XmlNode
m_xmld = New XmlDocument()
m_xmld.Load("../../../appconfig.xml")
m_nodelist = m_xmld.SelectNodes("/app/config")
Dim hostname, dbname, dbuser, dbpassword As String
hostname = ""
dbname = ""
dbuser = ""
dbpassword = ""
For Each m_node In m_nodelist
hostname = m_node.ChildNodes.Item(0).InnerText.ToString
dbname = m_node.ChildNodes.Item(1).InnerText.ToString
dbuser = m_node.ChildNodes.Item(2).InnerText.ToString
dbpassword = m_node.ChildNodes.Item(3).InnerText.ToString
Next
Dim connectionString = "Database=" & dbname & "; Data Source=" & hostname & "; User Id=" & dbuser & ";Password=" & dbpassword & "; Character Set=utf8"
Return connectionString
Catch errorVariable As Exception
MsgBox("Oops, An error occured: " & errorVariable.ToString)
End Try
End Function
无论何时需要连接,我都按如下方式使用:
Try
Dim query As String = "select * from tbl_lang where lang_status=1"
Dim cmd As New MySqlCommand(query, conn)
Dim dr As MySqlDataReader
dr = cmd.ExecuteReader
If dr.HasRows Then
Do While dr.Read
cmb.Items.Add(dr.GetString("lang_name"))
Loop
End If
cmb.SelectedItem = "English"
If Not dr.IsClosed Then dr.Close()
Catch ex As Exception
lbl_error.text="Oops, An error occured: " & ex.ToString
End Try
当代码被重用时,我总是遇到这个问题:这个连接已经打开了datareader
最好的处理方法是什么?有人提到对每个查询使用“打开新连接”,然后关闭它。不知何故,我不相信它,因为它可能会造成性能问题
请建议解决此问题的最佳方法。这是一个古老的信念(保持连接打开可以提高性能),但这一信念在您的应用程序中已不再适用,而且众所周知,它是代码中出现的严重错误的来源。模式是Create、Open、Use、Close和Dispose(最近的两个通常是一个调用)1。我不会使用保持开放的全局连接。为每个事务目的创建一个并正确关闭它。使用
使用
进行自动处置。另外,conn.Open()
在内部使用连接池,这在大多数情况下比自定义代码更智能。2.如果出现错误,您不会关闭DataReader。再次在DataReader上使用using
。为了补充AlexB所说的内容,我建议您将如果不是dr.IsClosed,那么dr.Close()
移动到的最后块Try\Catch
。