Использование Базы Данных Ms Access в Visual Basic 2010

Автор: Alex | Статьи | 21 Ноя 2011 22:07

В данной статье рассказывается об использовании Базы Данных 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

Отзывов нет »

Комментариев пока нет.

RSS-лента комментариев.

Ваш отзыв

Вы должны войти, чтобы оставлять комментарии.