Класс для работы с Базой Данных Access (обсуждение)

Форум посвящён работе с базами данных в .NET.

Модератор: Ramzes

Thomas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 246
Зарегистрирован: 12.11.2005 (Сб) 0:17
Откуда: "Сказочное королевство"

Класс для работы с Базой Данных Access (обсуждение)

Сообщение Thomas » 26.11.2006 (Вс) 20:43

Приветствую всех.
Вот выношу на обсуждение класс для доступа, работы и модификации Базы Данных созданной в Access.
Хотелось бы услышать конструктивную критику и пожелания: "какую функциональность еще добавить в класс" и "корректность коментариев".

Это, так сказать, превью версия.
Код: Выделить всё

Imports System.Data
Imports System.Data.OleDb
''' <summary>
''' Класс для доступа к базе данных Access
''' </summary>
''' <remarks>Класс содержит методы для отображения и модификации данных в таблицах ДБ</remarks>
Public Class AccessToDB

#Region "Переменные в классе"
    'declaration
    Private dbCon As OleDbConnection
    Private dbCmd As OleDbCommand
    Private dbDa As OleDbDataAdapter
    Private dbCmdBuilder As OleDbCommandBuilder
    Private ds As DataSet
    Private dr As DataRow
    Private dt As DataTable
    Private dv As DataView
    Private conStr As String
#End Region

#Region "Конструкторы класса"
    'constructors
    Public Sub New()
        conStr = "provider=microsoft.jet.oledb.4.0; data source=" + "D:\vti\Margo\nwind.mdb"
' наверное этот конструктор не нужен, он для определенной в нем базы
' а вот второй конструктор принимает в качестве параметра путь к базе
' значит можно создавать экземпляры класса для разных баз.
    End Sub
    ''' <summary>
    '''
    ''' </summary>
    ''' <param name="mdb">Полный путь к файлу базы данных Access</param>
    ''' <remarks>При создании экземпляра класса инициируется соединение с указанной Базой Данных</remarks>
    Public Sub New(ByVal mdb As String)
        conStr = "provider=microsoft.jet.oledb.4.0; data source=" + mdb
        initiateMdb()
    End Sub
#End Region

#Region "Методы класса"
    'methode
    Private Sub initiateMdb()
        Try
            dbCon = New OleDbConnection()
            dbCon.ConnectionString = conStr
            dbCmd = New OleDbCommand()
            dbCmd.Connection = dbCon
            dbDa = New OleDbDataAdapter(dbCmd)
            ds = New DataSet()
        Catch ex As Exception
            System.Windows.Forms.MessageBox.Show(ex.Message, "Ошибка при инициации доспупа к БД!")
        End Try
    End Sub

    ''' <summary>
    ''' Инициация таблицы в ДатаСет
    ''' </summary>
    ''' <param name="tableName">Имя таблицы, создаваемой в DataSet</param>
    ''' <param name="sql">SQL-команда для выборки данных из всех или определённых полей для заданной таблицы.</param>
    ''' <remarks>Здесь используется невыполнимое условие для создания пустой таблицы в ДатаСет, но с полями. ("Шапка" таблицы)</remarks>
    Public Sub initiateDataSet(ByVal tableName As String, ByVal sql As String)
        sql = sql.Replace(";", "")
        dbCmd.CommandText = sql + " where 1=0;"
        dbDa.Fill(ds, tableName)
    End Sub

    ''' <summary>
    ''' Метод для заполнения данными таблицы в ДатаСет
    ''' </summary>
    ''' <param name="tableName">Имя таблицы в ДатаСет, в которую будут добавлены данные.</param>
    ''' <param name="sql">SQL-команда определяющая данные которые будут добавлены.</param>
    ''' <remarks></remarks>
    Public Sub fillDataSet(ByVal tableName As String, ByVal sql As String)
        ds.Tables(tableName).Clear()
        dbCmd.CommandText = sql
        dbDa.Fill(ds, tableName)
    End Sub

    ''' <summary>
    ''' Метод для заполнения данными таблицы в ДатаСет
    ''' </summary>
    ''' <param name="tableName">Имя таблицы в ДатаСет, в которую будут добавлены данные.</param>
    ''' <param name="sql">SQL-команда определяющая данные которые будут добавлены.</param>
    ''' <param name="isnew">Значение - False, таблица уже существует и будет очищена от значений.</param>
    ''' <remarks></remarks>
    Public Sub fillDataSet(ByVal tableName As String, ByVal sql As String, ByVal isnew As Boolean)
        If isnew = False Then
            ds.Tables(tableName).Clear()
        End If
        dbCmd.CommandText = sql
        dbDa.Fill(ds, tableName)
    End Sub

    ''' <summary>
    ''' Метод выполнения SQL-команды
    ''' </summary>
    ''' <param name="sql">SQL-команда для выполнения</param>
    ''' <remarks></remarks>
    Public Sub doNonQuery(ByVal sql As String)
        Try
            dbCon.Open()
            dbCmd.CommandText = sql
            dbCmd.ExecuteNonQuery()
            dbCon.Close()
        Catch ex As Exception
            System.Windows.Forms.MessageBox.Show(ex.Message, "Ошибка при выполнении запроса к БД!")
        Finally
            dbCon.Close()
        End Try
    End Sub

    ''' <summary>
    ''' Метод обновления данных таблицы в Базе Данных
    ''' </summary>
    ''' <param name="tableName">Имя таблицы в ДатаСет, в которой будут обновлены данные.</param> 'in DataSet of in DataBase???
    ''' <remarks></remarks>
    Public Sub upDateTable(ByVal tableName As String)
        Dim count As Integer
        dbCmdBuilder = New OleDbCommandBuilder(dbDa)
        If ds.HasChanges(DataRowState.Modified) = True Then
            dbDa.UpdateCommand = dbCmdBuilder.GetUpdateCommand()
            Try
                count = dbDa.Update(ds, tableName)
                ds.Tables(tableName).AcceptChanges()
            Catch ex As Exception
                System.Windows.Forms.MessageBox.Show(ex.Message, "Ошибка при обновлении таблицы в ДС!")
            End Try
        End If
    End Sub

    ''' <summary>
    ''' Функция получения отфильтрованных данных из таблицы в ДатаСете, которые отвечают заданному условию.
    ''' </summary>
    ''' <param name="tableName">Имя таблицы в ДатаСет, данные из которой будут фильтроваться.</param>
    ''' <param name="condition">Условие по которому будут фильтроваться строки в таблице.</param>
    ''' <returns>DataViev с отфильтрованными по условию строками заданной таблицы в DataSet</returns>
    ''' <remarks>В качестве условия выступает имя поля в таблице, оператор сравнения или равенства и значение для сравнения.
    ''' Например: "birthdate>='1/1/1963'" - осуществляется выборка всех строк где значение указанного поля равно или больше
    ''' указанной даты; "city='London'" - все из Лондона; "title like '%rep%'" - где обращение похоже на "rep".</remarks>
    Public Function showData(ByVal tableName As String, ByVal condition As String) As DataView
        dv = New DataView()
        dv.Table = ds.Tables(tableName)
        dv.RowFilter = condition
        Return dv
    End Function

    ''' <summary>
    ''' Функция получения отфильтрованных данных из таблицы в ДатаСете, которые отвечают заданному условию.
    ''' </summary>
    ''' <param name="tableName">Имя таблицы в ДатаСет, данные из которой будут фильтроваться.</param>
    ''' <param name="condition">Условие по которому будут фильтроваться строки в таблице.</param>
    ''' <param name="fieldName">Имя поля в таблице, по которому выполняется сортировка. Сортировка по возрастанию.</param>
    ''' <returns>DataViev с отфильтрованными и отсортированными по условиям строками заданной таблицы в DataSet</returns>
    ''' <remarks></remarks>
    Public Function showData(ByVal tableName As String, ByVal condition As String, ByVal fieldName As String) As DataView
        dv = New DataView()
        dv.Table = ds.Tables(tableName)
        dv.RowFilter = condition
        dv.Sort = fieldName + " asc"
        Return dv
    End Function

    ''' <summary>
    ''' Метод создания таблицы в Базе Данных
    ''' </summary>
    ''' <param name="createStr">SQL команда создания таблицы в Базе Данных</param>
    ''' <param name="tableName">Имя создаваемой таблицы, для проверки на наличие такой таблицы.</param>
    ''' <remarks>Если в Базе данных существует такая таблица, то она удаляется.</remarks>
    Public Sub createTable(ByVal createStr As String, ByVal tableName As String)
        Try
            dbCon.Open()
            dbCmd.CommandText = createStr
            dbCmd.ExecuteNonQuery()
        Catch ex As Exception
            System.Windows.Forms.MessageBox.Show(ex.Message, "Ошибка при создании таблицы в ДБ!")
        Finally
            dbCon.Close()
        End Try
    End Sub

#End Region

#Region "Свойства класса"
    'property
    Public ReadOnly Property status() As ConnectionState
        Get
            Return dbCon.State
        End Get
    End Property

    Public ReadOnly Property myDs() As DataSet
        Get
            Return ds
        End Get
    End Property
#End Region

End Class


Заранее спасибо.

Всего самого :D
Met vriendelijke groetjes
VS2008 Pro FW3.5 SP1

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 27.11.2006 (Пн) 9:07

Уважаемый, копните ADO поглубже .... "и не морочте друзьям голову" (с) Джером-Джером
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Thomas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 246
Зарегистрирован: 12.11.2005 (Сб) 0:17
Откуда: "Сказочное королевство"

Сообщение Thomas » 27.11.2006 (Пн) 12:43

Sebas
Спасибо за пожелание.
В каком направлении копать?

ЗЫ и я не претендую на супер оригинальность, я учусь. Вот докопался до такой "глубины".
Met vriendelijke groetjes
VS2008 Pro FW3.5 SP1

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 27.11.2006 (Пн) 17:21

Ну, как бы не понятно, для чего это? Класс -бёртка не добавляющая никакого функционала.

Какую цель вы преследовали создавая этот класс?
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Сообщение Dmitriy2003 » 27.11.2006 (Пн) 20:05

Ну мож-было за идею принять хотябы результат работы Dataform wizard из VB тем более что в NET можно разгулятся. :)

Почему везде датасет и на етом капец. Он даже для некоторых операций и не нужен вовсе. :(

Вот мысля универсальный класс (не только с Аккесс ) задал базу, таблицу (или запрос или хранимую процедуру), задал режим представления Таблица, Форма, или может датарепеатер и получил результат в виде готовой формы, ну к примеру оформить можно както по своему, хотя ведь в большинстве случаев в программах обработки данных всяких разных красивостей вовсе и не требуется. :)
Dmitrich

Thomas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 246
Зарегистрирован: 12.11.2005 (Сб) 0:17
Откуда: "Сказочное королевство"

Сообщение Thomas » 28.11.2006 (Вт) 0:40

Dmitriy2003 писал(а):Ну мож-было за идею принять хотябы результат работы Dataform wizard из VB тем более что в NET можно разгулятся. :)


В 2005 студии такого визарда нет. 8)

Про хранимые процедуры.
Как я недавно узнал, при помощи .NET можно в Access создавать хранимые процедуры.
В принципе эту функциональность можно добавить.

Sebas

Этот класс я написал для работы с БД из MDI приложения. Мне кажеться, что это довольно удобно. Из любой формы можно вызвать нужные методы и функции предоставляемые экземпляром класса.
Met vriendelijke groetjes
VS2008 Pro FW3.5 SP1

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Сообщение Dmitriy2003 » 28.11.2006 (Вт) 2:21

Sebas писал
Уважаемый, копните ADO поглубже .... "и не морочте друзьям голову" (с) Джером-Джером
8)
Dmitrich

Thomas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 246
Зарегистрирован: 12.11.2005 (Сб) 0:17
Откуда: "Сказочное королевство"

Сообщение Thomas » 28.11.2006 (Вт) 9:30

Dmitriy2003
Спасибо. Копаю.
Met vriendelijke groetjes
VS2008 Pro FW3.5 SP1


Вернуться в ADO.NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9

    TopList