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

Я думаю, что это может немного объяснить.

Другие вопросы по тегам