处理OpenDataReader错误的最佳方法(vb.net和mysql)

处理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

我的项目运行在VS 2013和MySQL上,我将公共变量conn声明为mysqlconnection,并且在整个项目中使用相同的连接来执行任何数据库操作

    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