“已经有一个开放的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
以确保它的处理。 这将包括您的代码中使用的MemoryStream
和Image
。
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。 以上使用了所有的默认值。