Visual Basic Подключение к базе данных
Может ли кто-нибудь объяснить эти две функции или принцип, лежащий в основе этого, который мы используем при подключении базы данных к 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
2 ответа
performQuery
функция неисправна. Никогда не закрывает соединение (Return dbDataReader
происходит до закрытия соединения). С одной стороны - это хорошо, потому что DataReader бесполезен без открытого соединения. С другой стороны - соединение открывается как частная переменная внутри функции, поэтому оно выходит из области видимости при возврате функции, и вы никогда не знаете, когда сборщик мусора решит ее собрать. Это всегда весело, когда это происходит в середине Reader.Read.
Это хорошая идея, чтобы отделить соединение от выполнения, чтобы понятия не были настолько запутанными.
Первой концепцией здесь является установление соединения с базой данных с использованием строки соединения. но поскольку OleDbConnection связывает системные ресурсы, переменная, которая ее обрабатывает, должна быть правильно удалена независимо от того, происходит ли исключение. Вот почему Intellisense для переменной подключения сообщает вам, что.Dispose() является одним из методов.
Using cnn As OleDbConnection = New OleDbConnection(connectionString)
cnn.Open()
.
.
.
cnn.Close
End Using
Вторая концепция здесь заключается в том, что когда у вас есть открытое соединение с базой данных, вы можете использовать его для открытия объекта OleDbCommand, который позволяет вам либо (a) Считать что-либо из базы данных с помощью вашего метода "executeQuery" с помощью SELECT, либо (б) Сделайте что-нибудь с таблицей базы данных с помощью вашего метода "executeNonQuery", используя ключевые слова SQL, такие как UPDATE, DELETE или INSERT.
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
Я думаю, что это может немного объяснить.