有人可以解释一下这两个函数或者我们在 VB 连接数据库时使用的原理吗?该代码来 self 们的老师,我们的老师没有解释为什么应该这样编码。我们使用 MS Access 2003 文件作为数据库。
Imports System.Data.OleDb
Public Class Form1
Dim dbPath As String = Application.StartupPath & "\Database\xxxx.mdb"
Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0; DATA SOURCE = " & dbPath
Private Function performQuery(ByRef connectionString As String, ByVal sqlCommand As String) As OleDb.OleDbDataReader
Dim dbConnection As OleDbConnection
Dim dbCommand As New OleDbCommand()
Dim dbDataReader As OleDb.OleDbDataReader = Nothing
Try
dbConnection = New OleDbConnection(connectionString)
dbCommand.CommandText = sqlCommand
dbCommand.Connection = dbConnection
dbConnection.Open()
dbDataReader = dbCommand.ExecuteReader
Return dbDataReader
dbConnection.Close()
Catch ex As Exception
MessageBox.Show(ex.Message, Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning)
End Try
Return Nothing
End Function
Private Function performNonQuery(ByVal connectionString As String, ByVal sqlCommand As String) As Boolean
Dim dbConnection As OleDbConnection
Dim dbCommand As New OleDbCommand()
Try
dbConnection = New OleDbConnection(connectionString)
dbCommand.CommandText = sqlCommand
dbCommand.Connection = dbConnection
dbCommand.Connection.Open()
dbCommand.ExecuteNonQuery()
dbConnection.Close()
Catch ex As Exception
MessageBox.Show(ex.Message, Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning)
Return False
End Try
Return True
End Function
End Class
最佳答案
performQuery
函数有故障。它永远不会关闭连接(Return dbDataReader
发生在连接关闭之前)。一方面 - 这是一件好事,因为如果没有打开的连接,DataReader 就没用。另一方面 - 连接作为函数内部的私有(private)变量打开,因此当函数返回时它会超出范围,并且您永远不知道垃圾收集器何时决定收集它。当这种情况发生在 Reader.Read 中时总是很有趣。
关于database - Visual Basic 连接到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18791606/