“已经有一个开放的DataReader …”重新使用或处理数据库连接?

请帮助….当我从Mysql表中select数据显示“已经有一个打开的DataReader与此连接相关联,必须先closures.vb.net” 显示错误

Private Sub cmbJobCategoryVisa_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbJobCategoryVisa.SelectedIndexChanged ''" Dim MyCommand As New MySqlCommand("SELECT jobcategorycode FROM jobcategory WHERE jobcategory='" & Me.cmbJobCategoryVisa.SelectedItem & "'", MyConnection) Dim MyReader As MySqlDataReader = MyCommand.ExecuteReader While MyReader.Read If MyReader.HasRows = True Then Me.txtJobCategoryCodeVisa.Text = MyReader("jobcategorycode") End If End While MyReader.Close() MyCommand.Dispose() End Sub 

'''在下面的代码执行时,,,成像错误显示

  Private Sub txtEmpNo_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtEmpNo.Validating Dim MyCommand5 As New MySqlCommand("SELECT * FROM employeesmaster WHERE empno='" & Me.txtEmpNo.Text & "'", MyConnection) Dim MyDataReader5 As MySqlDataReader = MyCommand5.ExecuteReader If MyDataReader5.HasRows = True Then While MyDataReader5.Read Me.txtEmpName.Text = MyDataReader5("name") Me.cmbNationality.Text = MyDataReader5("nationality") Me.cmbJobCategoryVisa.Text = MyDataReader5("jobcategoryvisa") If Not IsDBNull(MyDataReader5("image")) Then Dim ImageData As Byte() = DirectCast(MyDataReader5("image"), Byte()) Dim MemoryStream As New IO.MemoryStream(ImageData) Me.pbxEmpImage.Image = Image.FromStream(MemoryStream) Else Me.pbxEmpImage.Image = Nothing End If End While Else End If MyDataReader5.Close() MyCommand5.Dispose() End Sub 

很明显,你正在使用一个单一的全局连接,并显然将其打开。 如前所述,您不应该重复使用或存储您的连接。 连接创build便宜,.NET根据需要进行了优化。

代码中有很多东西没有被closures和处理。 这应该是。 处置不仅可以防止您的应用程序泄漏资源,但这种错误不能使用每个任务新创build的数据库对象。

连接
由于在创build它们时存在回旋,所以可以编写一个函数来创build(也许是打开)一个新的Connection,并避免在任何地方粘贴连接string。 这是一个使用OleDB的一般示例:

 Public Function GetConnection(Optional usr As String = "admin", Optional pw As String = "") As OleDbConnection Dim conStr As String conStr = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};User Id={1};Password={2};", dbFile, usr, pw) Return New OleDbConnection(constr) End Function 

Using
在“使用”块中使用它,以便处理它:

 Using con As OleDb.OleDbConnection = GetConnection() Using cmd As New OleDbCommand(sql.Value, con) con.Open() Using rdr As OleDbDataReader = cmd.ExecuteReader() ' do stuff End Using ' close and dispose of reader End Using ' close and dispose of command End Using ' close, dispose of the Connection objects 

每个Using语句都会创build一个新的目标对象,并将其置于该块的末尾。

一般而言,任何具有Dispose方法的应用程序都可以并且应该在Using块中Using以确保它的处理。 这将包括您的代码中使用的MemoryStreamImage

Using块可以“堆叠”来指定多个对象并减less缩进(注意第一行结束后的逗号):

 Using con As OleDb.OleDbConnection = GetConnection(), cmd As New OleDbCommand(sql.Value, con) con.Open() ... End Using ' close and dispose of Connection and Command 

有关更多信息,请参阅

  • 使用声明
  • 连接池
  • 如何:处理系统资源

can u pls convert this code to Mysql connection... my connection string is...

对于基本的 MySQL连接:

 ' module level declaration Private MySQLDBase as String = "officeone" Function GetConnection(Optional usr As String = "root", Optional pw As String = "123456") As MySqlConnection Dim conStr As String conStr = String.Format("Server=localhost;Port=3306;Database={0};Uid={1}; Pwd={2};", MySQLDBase, usr, pw) Return New MySqlConnection(constr) End Function 

个人而言 ,我在方法中使用了一个类和一个ConnectionStringBuilder 。 有很多很酷的选项我使用,但不同的项目像项目数据库和默认的应用程序login。 以上使用了所有的默认值。