Использование Базы Данных Ms Access в Visual Basic 2010
В данной статье рассказывается об использовании Базы Данных Access в своих приложениях написанных на Visual Basic 2010.
Приводится пример исходного кода с подробным описанием для создания, редактирования и изменения как таблиц, так и записей базы данных.
В данном примере мы также познакомимся с использованием таких контролов, как ListBox, ListView, использование диалоговых окон InputBox, MessageBox и другое.
Перед использованием кода в Проект добавляем ссылку на компонент «Microsoft ADO Ext. 2.8 for DLL and Security» — Компонент для подклучения к базе данных и «Microsoft Jet and Replication Object 2.6 Library» — компонент используемый в программе для сжатия базы данных.
Весь проект сосоит из формы — Form1 и Модуля — Module1.
Начальные параметры файла Form1
Public Class Form1 'Здесь будем описывать Элементы управления формой End Class
На рисунке 1 показано, как размещены элементы управления на форме

Рисунок 1. Внешний вид формы
Начальные параметры файла Module1
Module Module1 'Здесь будем описывать работу с базой данных End Module
Далее Module1 Будет содержать следующие параметры
Imports System.Data
Imports System.Data.OleDb
Module Module1
Dim DataBaseFileName As String = Application.StartupPath & "\DataBase.mdb" 'Указывает расположение Базы Данных, располагается в каталоге, из которого была запущена программма
Dim Connector As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DataBaseFileName) 'Подключение к Базе Данных
Public Class DB
'Данный класс будет содержать функции по работе с Базой данных
End Class
Public Class Table
'Данный класс будет содержать функции по работе с Таблицами
End Class
Public Class Zap
'Данный класс будет содержать функции по работе с Записями базы данных
End Class
End Module
Далее к этому возвращаться не будем, просто будем указывать, что используем необходимый нам класс.
Для начала создадим баду данных. Добавим процедуру в Class DB.
Shared Sub DBnew()
Dim cat As New ADOX.Catalog
Try
'Создаем Базу
cat.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DataBaseFileName)
Catch ex As Runtime.InteropServices.COMException
MessageBox.Show(ex.Message) 'Если ошибки, то выводим сообщение
Finally
cat = Nothing
'Проверяем файл на диске
If IO.File.Exists(DataBaseFileName) = True Then
MessageBox.Show("База Данных Создана")
Else
MessageBox.Show("Ошибка Создания Базы Данных")
End If
End Try
End Sub
Во время работы с базой данных она может вырасти до неимоверных размеров, поэтому создадим еще одну процедуру, которая будет сжимать нашу базу данных. База будет сжата с именем DataBaseCompress.mdb.
Shared Sub Compress()
Dim jro As JRO.JetEngine
'Проверяем существует ли база данных
If IO.File.Exists(DataBaseFileName) = False Then
MessageBox.Show("Файл " & DataBaseFileName & " не найден", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error)
Exit Sub
End If
Try 'Сжимаем
jro = New JRO.JetEngine()
jro.CompactDatabase("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DataBaseFileName, _
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Application.StartupPath & "\DataBaseCompress.mdb" & ";Jet OLEDB:Engine Type=5")
'Проверяем существует ли файл сжатой базы данных
If IO.File.Exists(DataBaseFileName) = True Then
MessageBox.Show("База данных успешно сжата и создан файл: " & Application.StartupPath & "\DataBaseCompress.mdb", "Отчет", MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
Catch ex As Exception
MessageBox.Show(ex.Message) 'Если ошибки, то выводим сообщение
End Try
End Sub
В форму к кнопке «Создать базу данных» и «Сжать базу данных» добавим. При нажатии кнопки «Создать Базу», если файл базу уже существует на диске, будет выдано сообщение, говорящее, что файл уже существует.
Private Sub ButtonDBNew_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonDBNew.Click
DB.DBnew() 'Создание базы
End Sub
Private Sub ButtonDBCompress_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonDBCompress.Click
DB.Compress() 'Сжатие базы
End Sub
Переходим к описанию процедур в Public Class Table
Процедура добавления таблицы в Базу. После добавления таблицы в базу добавляем в ListBox имя добавленной нами таблицы
Shared Sub Add(ByRef ListBox1 As ListBox, ByVal Name As String)
Try
Connector.Open()
Dim Command As New OleDbCommand("Create Table [" & Name & "] ([Name] Text ,[Phone] Text)", Connector)
Command.ExecuteNonQuery()
Connector.Close()
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
ListBox1.Items.Add(Name) 'добавляем в ListBox имя добавленной нами таблицы
End Try
End Sub
Добавим процедуру загрузки таблиц базы данных в ListBox.
Shared Sub Load(ByRef ListBox1 As ListBox)
Try
ListBox1.Items.Clear()
Connector.Open()
Dim TmpDbRows As DataRowCollection = Connector.GetOleDbSchemaTable(OleDb.OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, "TABLE"}).Rows
For i = 0 To TmpDbRows.Count - 1
ListBox1.Items.Add(TmpDbRows(i).Item("TABLE_NAME").ToString)
Next i
Connector.Close()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
Добавляем в форму процедуры
Private Sub ButtonDBLoad_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonDBLoad.Click
DB.Load(ListBox1) 'Загрузка таблиц базы данных в LIstBox1
End Sub
Private Sub ButtonTableAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonTableAdd.Click
Table.Add(ListBox1, InputBox("Введите имя таблицы", "Добавление таблицы")) 'Добавляем в Базу новую таблицу с именем, введенным в диалоговом окне InputBox
End Sub
Базу данных мы уже создали, научились добавлять таблицы и просматривать какие таблицы находятся в нашей базе данных.
Теперь напишем процедуру, которая будет переименовывать выбранную в ListBox1 таблицу и добавим в Class Table
Shared Sub ReName(ByRef ListBox1 As ListBox, ByVal NewName As String)
Dim OldName As String = ListBox1.Items(ListBox1.SelectedIndex)
Dim objADOXDatabase
Try
objADOXDatabase = CreateObject("ADOX.Catalog")
objADOXDatabase.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DataBaseFileName
objADOXDatabase.Tables(OldName).Name = NewName
objADOXDatabase = Nothing
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
ListBox1.Items(ListBox1.SelectedIndex) = NewName
MessageBox.Show("Таблица переименована")
End Try
End Sub
Теперь напишем процедуру, которая будет удалять выбранную в ListBox1 таблицу и добавим в Class Table
Shared Sub Delete(ByRef ListBox1 As ListBox)
Dim Name As String = ListBox1.SelectedItem
Try
Connector.Open()
Dim Command As New OleDbCommand("DROP TABLE [" & Name & "]", Connector)
Command.ExecuteNonQuery()
Connector.Close()
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
ListBox1.Items.Remove(ListBox1.SelectedItem)
MessageBox.Show("Удалена таблица:" & Name)
End Try
End Sub
В форме привяжем к кнопкам соответствующий код:
Private Sub ButtonTableDel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonTableDel.Click
Table.Delete(ListBox1)' Удаляем Таблицу
End Sub
Private Sub ButtonTableReName_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonTableReName.Click
Table.ReName(ListBox1, InputBox("Введите новое имя таблицы", "Изменение имени таблицы", ListBox1.SelectedItem)) 'Переименовываем таблицу
End Sub
Теперь добавим в «Public Class Zap» процедуры, которые будут отвечать за добавление, изменение и удаление записей из таблицы
Добавление записи в таблицу. В первое текстовое поле вводим фамилию, во второе — телефон.
Shared Sub Add(ByVal Table As String, ByRef ListView1 As ListView, ByVal Name As String, ByVal Phone As String)
Try
Dim Command As New OleDbCommand("Insert Into [" & Table & "] ([Name], [Phone]) values ('" & Name & "', '" & Phone & "')", Connector)
Connector.Open()
Command.ExecuteNonQuery()
Connector.Close()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
ListView1.Items.Add(Name)
ListView1.Items.Item(ListView1.Items.Count - 1).SubItems.Add(Phone)
End Sub
Изменение выделенной записи в ListView
Shared Sub Edit(ByVal Table As String, ByRef ListView1 As ListView, ByVal Name As String, ByVal Phone As String)
Try
Dim Command As New OleDbCommand("UPDATE [" & Table & "] SET [Name]='" & Name & "', [Phone]='" & Phone & "' WHERE ([Name] Like '" & ListView1.SelectedItems.Item(0).Text & "')", Connector)
Connector.Open()
Command.ExecuteNonQuery()
Connector.Close()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
ListView1.SelectedItems.Item(0).Text = Name
ListView1.SelectedItems.Item(0).SubItems.Item(1).Text = Phone
End Sub
Процедура удаление выделенной записи.
Shared Sub Delete(ByVal Table As String, ByRef ListView1 As ListView)
Try
Dim Command As New OleDbCommand("DELETE FROM [" & Table & "] WHERE [Name]='" & ListView1.SelectedItems.Item(0).Text & "'", Connector)
Connector.Open()
Command.ExecuteNonQuery()
Connector.Close()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
ListView1.SelectedItems.Item(0).Remove()
End Sub
В форме кнопкам Добавить, изменить и удалить присвоим соответствующие процедуры
Private Sub ButtonZapAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonZapAdd.Click
Zap.Add(ListBox1.SelectedItem, ListView1, TextBox1.Text, TextBox2.Text)
End Sub
Private Sub ButtonZapEdit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonZapEdit.Click
Zap.Edit(ListBox1.SelectedItem, ListView1, TextBox1.Text, TextBox2.Text)
End Sub
Private Sub ButtonZapDel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonZapDel.Click
Zap.Delete(ListBox1.SelectedItem, ListView1)
End Sub
Добавим еще процедуру обработки двойного клика мышью в ListView, для вывода выделенной записи в текстовые поля для редактирования.
Private Sub ListView1_DoubleClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListView1.DoubleClick
Try
TextBox1.Text = ListView1.SelectedItems.Item(0).Text
TextBox2.Text = ListView1.SelectedItems.Item(0).SubItems.Item(1).Text
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
В данном примере много недоработок в том числе и нет обработчика ошибок:
например, не проверяются данные при создании, переименовывании таблиц, если вы не введете название таблицы, то будет выведена ошибка и другое…
Скачать пример использования Базы Данных Ms Access в Visual Basic 2010