Модераторы: gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Класс-оболочка для доступа и работы с БД. Выноситься на всеобщее обсуждение.VB.NET 
:(
    Опции темы
thomas
Дата 23.7.2007, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



Приветсвтую всех.  smile 
Предлагаю вашему вниманию класс оболочку который можно использовать для подключения к БД и выполнения обычных операций с ней. Этот клас сделан для БД Access, но если заменить OleDb на SqlClient то можно с таким же успехом использовать его и для подключения к БД на SQL server.

В любом классе программы, где нужны будут манипуляции с БД, создаете экземпляр этого класса и используете его методы и свойства. 

Критика и дополнения приветствуются.  smile 

Код

Imports System.Data
Imports System.Data.OleDb
Imports System.Configuration

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

#Region "Variable Declaration."

    Private con As OleDbConnection
    Private cmd As OleDbCommand
    Private da As OleDbDataAdapter
    Private cmdBuilder 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 "Constructor."
   
    ''' <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
        conStr = ConfigurationManager.AppSettings("contype") + mdb
        initiateMdb()
    End Sub
#End Region

#Region "Methodes."

    Private Sub initiateMdb()
        Try
            con = New OleDbConnection()
            con.ConnectionString = conStr
            cmd = New OleDbCommand()
            cmd.Connection = con
            da = New OleDbDataAdapter(cmd)
            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)
        Try
            sql = sql.Replace(";", "")
            cmd.CommandText = sql + " where 1=0;"
            da.Fill(ds, tableName)
        Catch ex As Exception
            System.Windows.Forms.MessageBox.Show(ex.Message, "Ошибка при инициации таблицы в ДС!")
        End Try
    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)
        If ds.Tables.IndexOf(tableName) >= -1 Then
            ds.Tables(tableName).Clear()
        End If
        Try
            cmd.CommandText = sql
            da.Fill(ds, tableName)
        Catch ex As Exception
            System.Windows.Forms.MessageBox.Show(ex.Message, "Ошибка при выполнении запроса к БД!")
        End Try
    End Sub

    ''' <summary>
    ''' Метод для заполнения данными таблицы в ДатаСет
    ''' </summary>
    ''' <param name="tableName">Имя таблицы в ДатаСет, в которую будут добавлены данные.</param>
    ''' <param name="sql">SQL-команда определяющая данные которые будут добавлены.</param>
    ''' <param name="isnew">Указывает на новая или уже существующая таблица.</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
        Try
            cmd.CommandText = sql
            da.Fill(ds, tableName)
        Catch ex As Exception
            System.Windows.Forms.MessageBox.Show(ex.Message, "Ошибка при выполнении запроса к БД!")
        End Try
    End Sub

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

    ''' <summary>
    ''' Метод выполнения SQL-команды возвращающей значение.
    ''' </summary>
    ''' <param name="sql">SQL-команда для выполнения</param>
    ''' <returns>Возвращает обьект из первой ячейки первой колонки.</returns>
    ''' <remarks>Выполняется sql-команда не возвращающая значений.</remarks>
    Public Function DoScalar(ByVal sql As String) As Object
        Dim res As Object = Nothing
        Try
            cmd.CommandText = sql
            con.Open()
            res = cmd.ExecuteScalar()
            con.Close()
        Catch ex As Exception
            System.Windows.Forms.MessageBox.Show(ex.Message, "Ошибка при выполнении запроса к БД!")
        End Try
        Return res
    End Function

    Public Sub ClearSqlParametrs()
        cmd.Parameters.Clear()
    End Sub

    Public Sub AddSqlParameter(ByVal param As String, ByVal value As Object)
        cmd.Parameters.AddWithValue(param, value)
    End Sub

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

    Public Sub DoUpdate(ByVal tableName As String, ByVal sql As String)
        Try
            ds.DataSetName = tableName
            cmd.CommandText = sql
            da.UpdateCommand = cmd
            da.Update(ds.Tables(tableName))
        Catch ex As Exception
            System.Windows.Forms.MessageBox.Show(ex.Message, "Ошибка при обновлении таблицы в БД!")
        End Try
    End Sub

    Public Function DoDelete(ByVal tableName As String) As Integer
        Dim count As Integer = 0
        ds.DataSetName = tableName
        cmdBuilder = New OleDbCommandBuilder(da)
        da.DeleteCommand = cmdBuilder.GetDeleteCommand()
        Try
            count = da.Update(ds, tableName)
            ds.Tables(tableName).AcceptChanges()
        Catch ex As Exception
            System.Windows.Forms.MessageBox.Show(ex.Message, "Ошибка при обновлении таблицы в БД!")
        End Try
        Return count
    End Function

    Public Function DoInsert(ByVal tableName As String) As Integer
        Dim count As Integer = 0
        ds.DataSetName = tableName
        cmdBuilder = New OleDbCommandBuilder(da)
        da.InsertCommand = cmdBuilder.GetInsertCommand()
        Try
            count = da.Update(ds, tableName)
            ds.Tables(tableName).AcceptChanges()
        Catch ex As Exception
            System.Windows.Forms.MessageBox.Show(ex.Message, "Ошибка при обновлении таблицы в БД!")
        End Try
        Return count
    End Function

    ''' <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
            con.Open()
            cmd.CommandText = createStr
            cmd.ExecuteNonQuery()
        Catch ex As Exception
            System.Windows.Forms.MessageBox.Show(ex.Message, "Ошибка при создании таблицы в ДБ!")
        Finally
            con.Close()
        End Try
    End Sub

    ''' <summary>
    ''' Функция создания новой строки в таблице ДатаСета.
    ''' </summary>
    ''' <param name="tableName">Имя таблицы, где создается новая строка.</param>
    ''' <returns>Пустая строка в заданной таблице.</returns>
    ''' <remarks>Передаем в форму пустую строку в заданной таблице для заполнения данными и возврата в класс в Метод AddRowToTable().</remarks>
    Public Function CreateRow(ByVal tableName As String) As DataRow
        dr = ds.Tables(tableName).NewRow()
        Return dr
    End Function

    ''' <summary>
    ''' Метод вставки заполненной строки в заданную таблицу ДатаСета.
    ''' </summary>
    ''' <param name="tableName">имя таблицы куда добавляем строку.</param>
    ''' <param name="dr">Заполненая данными строка.</param>
    ''' <remarks>Добавляем созданную в функции CreateRow() и заполненную данными строку в заданную таблицу.</remarks>
    Public Sub AddRowToTable(ByVal tableName As String, ByVal dr As DataRow)
        ds.Tables(tableName).Rows.Add(dr)
        ds.AcceptChanges()
    End Sub

#End Region

#Region "Properties."

    Public ReadOnly Property status() As ConnectionState
        Get
            Return con.State
        End Get
    End Property

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

End Class




--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
Experimenter
Дата 30.7.2007, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 3
Всего: 17



Можно добавить создание связей между таблицами и цены твоему классу не будет!


--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
tol05
Дата 1.8.2007, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 11
Всего: 170



Цитата(thomas @  23.7.2007,  00:24 Найти цитируемый пост)
но если заменить OleDb на SqlClient то можно с таким же успехом использовать его и для подключения к БД на SQL server

thomas, да сделай универсальный класс, под любого провайдера!
1. Замени везде у себя 
Код

...
Private con As OleDbConnection    
Private cmd As OleDbCommand    
Private da As OleDbDataAdapter    
...

на 
Код

...
Private con As DbConnection    
Private cmd As DbCommand    
Private da As DbDataAdapter    
...
 
или добавь сразу поля для соединения, команды, адаптера и т.д. под все виды провайдеров...
2. Сделай
Код

enum DbProviders{OleDb, SqlClient, OracleClient} и т.д.

членом класса, в конструкторе можно будет выбирать нужное значение и тогда можно будет работать под конкретного провайдера. 
и вместо  
cmd = New OleDbCommand()
в каждом случае будет
cmd = New OleDbCommand() или
cmd = New SqlCommand() или...
Полиморфизм - могучая штука... 

Если не получится сделать один универсальный класс, с работой через базовые DbConnection, DbCommand, DbDataAdapter - можно сделать абстрактный класс BaseAccessToDB и под каждого провайдера - наследника. Это более легковесный вариант, для каждого провайдера - только нужные ему данные и ничего лишнего. Неплохая библиотека может получиться.
Короче, думаю, мысль понятна smile


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
thomas
Дата 1.8.2007, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



Experimenter, 
tol05, 
Спасибо за отклики.
Пока нет времени, но в плане стоит работа над этим классом. Есть еще мысли.
А пока в процессе использования в реальной программе обнаружилась ошибочка вот здесь:
Код

''' <summary>
    ''' Метод вставки заполненной строки в заданную таблицу ДатаСета.
    ''' </summary>
    ''' <param name="tableName">имя таблицы куда добавляем строку.</param>
    ''' <param name="dr">Заполненая данными строка.</param>
    ''' <remarks>Добавляем созданную в функции CreateRow() и заполненную данными строку в заданную таблицу.</remarks>
    Public Sub AddRowToTable(ByVal tableName As String, ByVal dr As DataRow)
        ds.Tables(tableName).Rows.Add(dr)
        'ds.AcceptChanges() НУЖНО УДАЛИТЬ!!!
    End Sub

Этот метод(ds.AcceptChanges()) нельзя вызывать. Если в ДС поместить пустую таблицу из БД и заполнять ее строками при помощи этого метода(AddRowToTable(ByVal tableName As String, ByVal dr As DataRow)) то, таблицу мы заполним, не вопрос, а вот потом выполнить обновление таблицы в БД будет невозможно. Не выполняется условие:
Код

If ds.HasChanges(DataRowState.Modified OR DataRowState.Added) = True Then





Это сообщение отредактировал(а) thomas - 1.8.2007, 21:35


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
Experimenter
Дата 2.8.2007, 06:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 3
Всего: 17



Еще нужно научить класс задавать типы данных для полей таблиц. Ты создаешь DataTable, задаешь для полей типы данных и сохраняешь эту таблицу в базе. Не помню точно, но по-моему типы данных как-то выдергиваются из DataTable при создании таблицы в Access. А если вдруг понадобится какой-либо тип изменить? Также (наверное) необходимо предусмотреть создание первичных-вторичных ключей, автоинкрементных полей.


--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
thomas
Дата 2.8.2007, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



Experimenter, 
Цитата

Еще нужно научить класс задавать типы данных для полей таблиц. Ты создаешь DataTable, задаешь для полей типы данных и сохраняешь эту таблицу в базе.

Я делаю это так:
Код

Private Sub CreateTable(ByVal tableName As String)
        Dim sql As String
        sql = "CREATE TABLE " + tableName
        sql += " (RowId varchar(12) primary key"
        For Each AdComp In comps
            sql += ", [" & AdComp.namePost & "] varchar(" & AdComp.length.ToString() & ")"
        Next
        sql += ", psCode varchar(12))"
        db.DoNonQuery(sql)
    End Sub 

И ву а ля, таблица в БД Access создана. Здесь правда все поля текстовые, но разной длинны.
Цитата

Также (наверное) необходимо предусмотреть создание первичных-вторичных ключей, автоинкрементных полей. 
Это тоже прописывается в sql-команде. 
А вот создание связей между таблицами в ДС будет наверное не лишним.
Цитата

Не помню точно, но по-моему типы данных как-то выдергиваются из DataTable при создании таблицы в Access. 

Это что-то непонятное.
Вообще если в ДС содать таблицу на основе таблицы из БД, то да, типы полей соответствуют типам из БД.


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
Experimenter
Дата 5.8.2007, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 3
Всего: 17



Цитата

Это что-то непонятное.

Если ты в таблице создаешь DataColumn:

Код

        DataColumn dc = new DataColumn();
        dc.DataType = typeof(System.Int32);


хочешь сказать, что при конвертации таблицы в Access тип данных, заданный для столбца, не будет учтен?


--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
ckopn
Дата 6.8.2007, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



На СиШарпе кода нет?
PM MAIL   Вверх
moric83
Дата 6.8.2007, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 9.7.2007

Репутация: нет
Всего: 1



Цитата(ckopn @  6.8.2007,  14:47 Найти цитируемый пост)
На СиШарпе кода нет? 


Вот: http://www.developerfusion.co.uk/Utilities...vbtocsharp.aspx
 smile 
PM MAIL   Вверх
ckopn
Дата 9.8.2007, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



Цитата(moric83 @ 6.8.2007,  17:16)
Цитата(ckopn @  6.8.2007,  14:47 Найти цитируемый пост)
На СиШарпе кода нет? 


Вот: http://www.developerfusion.co.uk/Utilities...vbtocsharp.aspx
 smile

Супер!
PM MAIL   Вверх
thomas
Дата 9.8.2007, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



ckopn, 
Цитата

На СиШарпе кода нет? 

Получите и распишитесь.
Код

using System;
using System.Collections.Generic;
using System.Text;
using System.Data.OleDb;
using System.Data;
using System.Data.SqlClient;

namespace GlobalDb
{
    class SqlDb
    {
         # region Declaration
        private SqlCommand dbCmd;
        private SqlConnection dbCon;
        private SqlDataAdapter dbDa;
        //private SqlDataReader dbR;
        //private SqlParameter[] param;
        private SqlCommandBuilder cmdBuild;
        private DataSet ds;
        private DataTable dt;
        private DataRow dr;
        private string conStr;
        # endregion

        public SqlDb()
        {
         conStr = @"Data Source=(local); " +  //<---- Misschin bij je, kan DAT helpen!!!
           //conStr = @"Data Source=.\SQLEXPRESS; " +
                    @"integrated security = true; Trusted_Connection = yes; " +
                    @"AttachDbFilename=D:\vti\Margo\snoepwinkel.mdf; database=snoepwinkel";
           intmdb();
        }

        public SqlDb(string mdb, string db)
        {
            conStr = @"Data Source=.\SQLEXPRESS;integrated security = true;" +
                     @"Trusted_Connection = yes; database= " + db +
                     @"; AttachDbFilename = " + mdb;
            intmdb();
        }

        private void intmdb()
        {
            try
            {
                dbCon = new SqlConnection();
                dbCon.ConnectionString = conStr;
                dbCmd = new SqlCommand();
                dbCmd.Connection = dbCon;
                dbDa = new SqlDataAdapter(dbCmd);
                ds = new DataSet();
                // uitbreibaar met andere initializatie
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show("init fout :" +ex.Message, "fout init dataset");
            }
        }

        public void initDataSet(string tabelNm, string sql)
        {
            sql = sql.Replace(";", "");
            dbCmd.CommandText = sql + " where 1=0;";
            dbDa.Fill(ds, tabelNm);
        }

        public void fillDataSet(string tabelNm, string sql)
        {           
                ds.Tables[tabelNm].Clear();
                dbCmd.CommandText = sql;
                dbDa.Fill(ds, tabelNm);
        }

        public void fillDataSet(string tabelNm, string sql, bool isnew)
        {
            if (!isnew) ds.Tables[tabelNm].Clear();               
            dbCmd.CommandText = sql;
            dbDa.Fill(ds, tabelNm);          
        }

        public DataRow createRow(string tabelNm)
        {
            dt=ds.Tables[tabelNm];
            dr = dt.NewRow();
            return dr;
        }

        public void addRow(DataRow dr, string tabelNm)
        {
            ds.Tables[tabelNm].Rows.Add(dr);
        }

        public void datasetFromProcedure(string dsNm, string procNm, bool nieuw)
        {
            dbCmd.CommandText = procNm;
            dbCmd.CommandType = CommandType.StoredProcedure;
            try
            {
                dbDa.Fill(ds, dsNm);
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show("dataSetFromProcedure " + procNm +
                    ": " + ex.Message);
            }
 
        }

        public void doNonQuery(string sql)
        {
            try
            {
                dbCon.Open();
                dbCmd.CommandText = sql;
                dbCmd.CommandType = CommandType.Text;
                dbCmd.ExecuteNonQuery();
                dbCon.Close();
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show("ExNonQuery fout :" + ex.Message, "fout Quary");
            }
            finally
            {
                dbCon.Close();
            }
        }

        public int DoUpdate(string dsNm)
        {
            ds.DataSetName = dsNm;
            cmdBuild = new SqlCommandBuilder(dbDa);
            dbDa.UpdateCommand = cmdBuild.GetUpdateCommand();
            return dbDa.Update(ds.Tables[dsNm]);
        }

        //public int DoInsert(string dsNm)
        //{
        //    ds.DataSetName = dsNm;
        //    cmdBuild = new SqlCommandBuilder(dbDa);
        //    dbDa.InsertCommand = cmdBuild.GetInsertCommand();
        //    return dbDa.Update(ds.Tables[dsNm]);
        //}

        public void ClearParameters()
        { dbCmd.Parameters.Clear(); }

        public void AddParameters(string parNaam, object val)
        {
            dbCmd.Parameters.AddWithValue(parNaam, val);
        }

        public long DoInsert(string stp)
        {
            long value = -1;
            dbCmd.CommandText = stp;
            dbCmd.CommandType = CommandType.StoredProcedure;
            //dbCmd.Parameters.Clear();
            try
            {
                dbCon.Open();
                value = Convert.ToInt64(dbCmd.ExecuteScalar());
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show("DoInsert fout :" + ex.Message, "fout Insert");
            }
            finally
            { dbCon.Close(); }
            return value;
        }

        public long DoInsert(string stp, SqlParameter[] param)
        {
            long value=-1;
            dbCmd.CommandText = stp;
            dbCmd.CommandType = CommandType.StoredProcedure;
            dbCmd.Parameters.Clear();
            for (int i = 0; i < param.GetLength(0); i++)
            {
                if (param[i] != null)
                {
                    dbCmd.Parameters.Add(param[i]);
                }
            }
            try
            {
                dbCon.Open();
                value=Convert.ToInt64(dbCmd.ExecuteScalar());
            }
            catch(Exception ex)
            {
                System.Windows.Forms.MessageBox.Show("DoInsert fout :" + ex.Message, "fout Insert");
            }
            finally
            { dbCon.Close();}
            return value;
        }

        public ConnectionState status()
        {
            return dbCon.State;
        }

        public DataSet DS
        { 
            get{return ds;}
            set{}
        }
    }

    class clAccessDb
    {
        # region Declaration
        private OleDbCommand dbCmd;
        private OleDbConnection dbCon;
        private OleDbDataAdapter dbDa;
        private DataSet ds;
        private DataTable dt;
        private DataRow dr;
        private string conStr;
        # endregion

        public clAccessDb()
        {
           conStr = "provider=microsoft.jet.oledb.4.0; data source=" +
                //onderste regel is eigenlijk niet juist, dient als default
                @"D:\vti\Margo\cyberpro.mdb";
           //intmdb();
        }

        public clAccessDb(string mdb)
        {
           conStr = "provider=microsoft.jet.oledb.4.0; data source=" + mdb;
           
            intmdb();
        }

        private void intmdb()
        {
            try
            {
                dbCon = new OleDbConnection();
                dbCon.ConnectionString = conStr;
                dbCmd = new OleDbCommand();
                dbCmd.Connection = dbCon;
                dbDa = new OleDbDataAdapter(dbCmd);
                ds = new DataSet();
                // uitbreibaar met andere initializatie
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show("init fout :" +ex.Message, "fout init dataset");
            }
        }

        public void initDataSet(string tabelNm, string sql)
        {
            sql = sql.Replace(";", "");
            dbCmd.CommandText = sql + " where 1=0;";
            dbDa.Fill(ds, tabelNm);
        }

        public void fillDataSet(string tabelNm, string sql)
        {           
                ds.Tables[tabelNm].Clear();
                dbCmd.CommandText = sql;
                dbDa.Fill(ds, tabelNm);
        }

        public void fillDataSet(string tabelNm, string sql, bool isnew)
        {
            if (!isnew) ds.Tables[tabelNm].Clear();               
            dbCmd.CommandText = sql;
            dbDa.Fill(ds, tabelNm);          
        }

        public void doNonQuery(string sql)
        {
            try
            {
                dbCon.Open();
                dbCmd.CommandText = sql;
                dbCmd.ExecuteNonQuery();
                dbCon.Close();
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show("ExNonQuery fout :" + ex.Message, "fout Quary");
            }
            finally
            {
                dbCon.Close();
            }
        }

        public ConnectionState status()
        {
            return dbCon.State;
        }

        public DataSet DS
        { 
            get
            {
                return ds;
            }
            set
            {
            }
        }
    }
}




--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
Mag
Дата 10.8.2007, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 23.6.2005

Репутация: нет
Всего: нет



Цитата(thomas @ 9.8.2007,  17:29)
ckopn, 
Цитата

На СиШарпе кода нет? 

Получите и распишитесь.
Код

using System;
using System.Collections.Generic;
using System.Text;
using System.Data.OleDb;
using System.Data;
using System.Data.SqlClient;

namespace GlobalDb
{
    class SqlDb
    {
         # region Declaration
        private SqlCommand dbCmd;
        private SqlConnection dbCon;
        private SqlDataAdapter dbDa;
        //private SqlDataReader dbR;
        //private SqlParameter[] param;
        private SqlCommandBuilder cmdBuild;
        private DataSet ds;
        private DataTable dt;
        private DataRow dr;
        private string conStr;
        # endregion

        public SqlDb()
        {
         conStr = @"Data Source=(local); " +  //<---- Misschin bij je, kan DAT helpen!!!
           //conStr = @"Data Source=.\SQLEXPRESS; " +
                    @"integrated security = true; Trusted_Connection = yes; " +
                    @"AttachDbFilename=D:\vti\Margo\snoepwinkel.mdf; database=snoepwinkel";
           intmdb();
        }

        public SqlDb(string mdb, string db)
        {
            conStr = @"Data Source=.\SQLEXPRESS;integrated security = true;" +
                     @"Trusted_Connection = yes; database= " + db +
                     @"; AttachDbFilename = " + mdb;
            intmdb();
        }

        private void intmdb()
        {
            try
            {
                dbCon = new SqlConnection();
                dbCon.ConnectionString = conStr;
                dbCmd = new SqlCommand();
                dbCmd.Connection = dbCon;
                dbDa = new SqlDataAdapter(dbCmd);
                ds = new DataSet();
                // uitbreibaar met andere initializatie
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show("init fout :" +ex.Message, "fout init dataset");
            }
        }

        public void initDataSet(string tabelNm, string sql)
        {
            sql = sql.Replace(";", "");
            dbCmd.CommandText = sql + " where 1=0;";
            dbDa.Fill(ds, tabelNm);
        }

        public void fillDataSet(string tabelNm, string sql)
        {           
                ds.Tables[tabelNm].Clear();
                dbCmd.CommandText = sql;
                dbDa.Fill(ds, tabelNm);
        }

        public void fillDataSet(string tabelNm, string sql, bool isnew)
        {
            if (!isnew) ds.Tables[tabelNm].Clear();               
            dbCmd.CommandText = sql;
            dbDa.Fill(ds, tabelNm);          
        }

        public DataRow createRow(string tabelNm)
        {
            dt=ds.Tables[tabelNm];
            dr = dt.NewRow();
            return dr;
        }

        public void addRow(DataRow dr, string tabelNm)
        {
            ds.Tables[tabelNm].Rows.Add(dr);
        }

        public void datasetFromProcedure(string dsNm, string procNm, bool nieuw)
        {
            dbCmd.CommandText = procNm;
            dbCmd.CommandType = CommandType.StoredProcedure;
            try
            {
                dbDa.Fill(ds, dsNm);
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show("dataSetFromProcedure " + procNm +
                    ": " + ex.Message);
            }
 
        }

        public void doNonQuery(string sql)
        {
            try
            {
                dbCon.Open();
                dbCmd.CommandText = sql;
                dbCmd.CommandType = CommandType.Text;
                dbCmd.ExecuteNonQuery();
                dbCon.Close();
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show("ExNonQuery fout :" + ex.Message, "fout Quary");
            }
            finally
            {
                dbCon.Close();
            }
        }

        public int DoUpdate(string dsNm)
        {
            ds.DataSetName = dsNm;
            cmdBuild = new SqlCommandBuilder(dbDa);
            dbDa.UpdateCommand = cmdBuild.GetUpdateCommand();
            return dbDa.Update(ds.Tables[dsNm]);
        }

        //public int DoInsert(string dsNm)
        //{
        //    ds.DataSetName = dsNm;
        //    cmdBuild = new SqlCommandBuilder(dbDa);
        //    dbDa.InsertCommand = cmdBuild.GetInsertCommand();
        //    return dbDa.Update(ds.Tables[dsNm]);
        //}

        public void ClearParameters()
        { dbCmd.Parameters.Clear(); }

        public void AddParameters(string parNaam, object val)
        {
            dbCmd.Parameters.AddWithValue(parNaam, val);
        }

        public long DoInsert(string stp)
        {
            long value = -1;
            dbCmd.CommandText = stp;
            dbCmd.CommandType = CommandType.StoredProcedure;
            //dbCmd.Parameters.Clear();
            try
            {
                dbCon.Open();
                value = Convert.ToInt64(dbCmd.ExecuteScalar());
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show("DoInsert fout :" + ex.Message, "fout Insert");
            }
            finally
            { dbCon.Close(); }
            return value;
        }

        public long DoInsert(string stp, SqlParameter[] param)
        {
            long value=-1;
            dbCmd.CommandText = stp;
            dbCmd.CommandType = CommandType.StoredProcedure;
            dbCmd.Parameters.Clear();
            for (int i = 0; i < param.GetLength(0); i++)
            {
                if (param[i] != null)
                {
                    dbCmd.Parameters.Add(param[i]);
                }
            }
            try
            {
                dbCon.Open();
                value=Convert.ToInt64(dbCmd.ExecuteScalar());
            }
            catch(Exception ex)
            {
                System.Windows.Forms.MessageBox.Show("DoInsert fout :" + ex.Message, "fout Insert");
            }
            finally
            { dbCon.Close();}
            return value;
        }

        public ConnectionState status()
        {
            return dbCon.State;
        }

        public DataSet DS
        { 
            get{return ds;}
            set{}
        }
    }

    class clAccessDb
    {
        # region Declaration
        private OleDbCommand dbCmd;
        private OleDbConnection dbCon;
        private OleDbDataAdapter dbDa;
        private DataSet ds;
        private DataTable dt;
        private DataRow dr;
        private string conStr;
        # endregion

        public clAccessDb()
        {
           conStr = "provider=microsoft.jet.oledb.4.0; data source=" +
                //onderste regel is eigenlijk niet juist, dient als default
                @"D:\vti\Margo\cyberpro.mdb";
           //intmdb();
        }

        public clAccessDb(string mdb)
        {
           conStr = "provider=microsoft.jet.oledb.4.0; data source=" + mdb;
           
            intmdb();
        }

        private void intmdb()
        {
            try
            {
                dbCon = new OleDbConnection();
                dbCon.ConnectionString = conStr;
                dbCmd = new OleDbCommand();
                dbCmd.Connection = dbCon;
                dbDa = new OleDbDataAdapter(dbCmd);
                ds = new DataSet();
                // uitbreibaar met andere initializatie
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show("init fout :" +ex.Message, "fout init dataset");
            }
        }

        public void initDataSet(string tabelNm, string sql)
        {
            sql = sql.Replace(";", "");
            dbCmd.CommandText = sql + " where 1=0;";
            dbDa.Fill(ds, tabelNm);
        }

        public void fillDataSet(string tabelNm, string sql)
        {           
                ds.Tables[tabelNm].Clear();
                dbCmd.CommandText = sql;
                dbDa.Fill(ds, tabelNm);
        }

        public void fillDataSet(string tabelNm, string sql, bool isnew)
        {
            if (!isnew) ds.Tables[tabelNm].Clear();               
            dbCmd.CommandText = sql;
            dbDa.Fill(ds, tabelNm);          
        }

        public void doNonQuery(string sql)
        {
            try
            {
                dbCon.Open();
                dbCmd.CommandText = sql;
                dbCmd.ExecuteNonQuery();
                dbCon.Close();
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show("ExNonQuery fout :" + ex.Message, "fout Quary");
            }
            finally
            {
                dbCon.Close();
            }
        }

        public ConnectionState status()
        {
            return dbCon.State;
        }

        public DataSet DS
        { 
            get
            {
                return ds;
            }
            set
            {
            }
        }
    }
}


Класс! Главное - то, что нужно.
--------------------
В  каждой черной комнате есть выход - всегда есть выход с любой ситуации!
PM MAIL WWW ICQ   Вверх
thomas
Дата 1.11.2007, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



Привет всем.
Постараюсь в ближайшее время проработать высказанные выше пожелания.



--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
kirillga
Дата 13.12.2007, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 1.12.2007

Репутация: нет
Всего: нет



Подскажите новечку как пользоваться класом???
пишу так:
Код

clAccessDb AccDB = new clAccessDb("D:\\VTB.mdb");
            AccDB.initDataSet("spravochnik_sistem","SELECT name_system FROM spravochnik_sistem WHERE type_system=0");

Хочу результат в comboBox положить.

ЗАРАНЕЕ ОГРОМНОЕ СПАСИБО.
PM   Вверх
Aquarius
Дата 23.6.2008, 06:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 9.4.2008

Репутация: нет
Всего: нет



Цитата(kirillga @ 13.12.2007,  20:44)
Подскажите новечку как пользоваться класом???
пишу так:
Код

clAccessDb AccDB = new clAccessDb("D:\\VTB.mdb");
            AccDB.initDataSet("spravochnik_sistem","SELECT name_system FROM spravochnik_sistem WHERE type_system=0");

Хочу результат в comboBox положить.

ЗАРАНЕЕ ОГРОМНОЕ СПАСИБО.

Товарищи, действительно, как пользоваться классом ? 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0662 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.