有人可以解释我们在将数据库连接到VB时使用的这两个函数或其背后的原理吗?该代码来自我们的老师,我们的老师没有解释为什么应该这样编码。我们正在为数据库使用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
答案 0 :(得分:1)
performQuery
功能有问题。它永远不会关闭连接(Return dbDataReader
在连接关闭之前发生。一方面 - 这是一件好事,因为DataReader在没有开放连接的情况下是无用的。另一方面 - 连接在函数内部作为私有变量打开,因此当函数返回时它会超出范围,并且您永远不知道垃圾收集器何时决定收集它。在Reader.Read中间发生这种情况总是很有趣。
答案 1 :(得分:1)
将连接与执行分开是个好主意,因此概念不会那么混乱。
这里的第一个概念是使用连接字符串建立与数据库的连接。 但由于OleDbConnection会占用系统资源,因此无论是否发生异常,都需要正确处理处理它的变量。这就是为什么连接变量上的Intellisense告诉你.Dispose()是方法之一。
Using cnn As OleDbConnection = New OleDbConnection(connectionString)
cnn.Open()
.
.
.
cnn.Close
End Using
这里的第二个概念是当你有一个与数据库的开放连接时,你可以用它来打开一个OleDbCommand对象,它允许你(a)通过SELECT的“performQuery”方法从数据库中读取一些东西或者(b)使用SQL关键字(如UPDATE,DELETE或INSERT)通过“performNonQuery”方法对数据库表执行某些操作。
Using cmd As New OleDbCommand(sqlCommand, cnn)
' Use cnn.ExecuteReader() to get a data reader back,
' or use cnn.ExecuteNonQuery() to get the number of rows affected back.
.
.
.
End Using
第三,如果要返回信息,通常会返回一个数据矩形,可以通过使用OleDbDataReader对象逐步执行,一次一行。但是数据读取器作为返回参数是无用的,因为它会使连接保持打开状态,并且还会将数据库游标指向当前行。那不好!
最好只返回表格形式的内存中的数据,例如DataTable对象:
dim dt as DataTable = new DataTable("TableName")
Using cnn As OleDbConnection = New OleDbConnection(connectionString)
cnn.Open() ' open the connection
Using cmd As New OleDbCommand(sqlCommand, cnn) ' make a command object
dr = cmd.ExecuteReader() ' execute the reader
dt.Load(dr) ' BAM - get all the data into the DataTable at once
End Using ' close everything up
Return dt
我认为这可能会解释一些事情。