Добавление записей в БД accdb

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

AndrNet
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 08.06.2009 (Пн) 9:09

Добавление записей в БД accdb

Сообщение AndrNet » 14.01.2015 (Ср) 19:32

Помогите пожалуйста, я не могу переключится с VB6 на NET. Задача такая, нужно при нажатии кнопки ОК на Form2 сохранить значение полей в таблицу Client.
Вложения
Autobox.rar
Проект с базой
(279.29 Кб) Скачиваний: 452

crabdance
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 10.01.2015 (Сб) 2:54

Re: Добавление записей в БД accdb

Сообщение crabdance » 14.01.2015 (Ср) 20:03

Можно пару вопросов?
Вы работаете с базой напрямую, или через Dataset?

Версия, я гляжу, 12... Жаль, я в 10.
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Re: Добавление записей в БД accdb

Сообщение MEMBER » 14.01.2015 (Ср) 20:09

Сейчас как раз пишу мелкую бд. Вот код модуля работы с БД:

Код: Выделить всё
Module WorkWithBase
    Dim con As New OleDb.OleDbConnection ' Объявляем 'con' как Connection Object
    Dim da As New OleDb.OleDbDataAdapter ' Создаём DataAdapter, посредника между DataSet и базой данных
    Public ds As New DataSet ' Создаём DataSet, объект, в который будут помещены данные из БД
    Public tblName As String ' Переменная, в которую будет помещено имя DataSet для упрощения обращения к нему
    Dim int_RowNumber As Integer ' Переменная, содержащая в себе текущую позицию курсора в DataSet

    Sub openDatabase(ByRef dbProvider As String, ByRef dbSource As String)
        ' dbProvider как "PROVIDER=Microsoft.Jet.OLEDB.4.0;"
        ' dbSource как "C:\databasename.mdb"
        con.ConnectionString = dbProvider & dbSource

        Try

            If con.State = ConnectionState.Closed Then
                con.Open()
            Else
                con.Close()
                con.Open()
            End If
        Catch ex As Exception
            MsgBox(ex.Message, , "Ошибка! Не удалось открыть " & dbSource & " OopenDataBase - module WorkWithBase")
        End Try

    End Sub

    Sub closeDatabase()
        con.Close()

    End Sub

    Sub connectToDB(str_queryString As String)
        ' queryString как "SELECT SongCount AS Номер, SingerName AS Исполнитель, SongName AS Название, Poet AS Автор_текста, Kompozitor AS Композитор, " _
        '                   & "FileName AS Имя_файла FROM Songs"
        Try
            ' разрушаем DataAdapter
            da.Dispose()
        Catch ex As Exception
            MsgBox(ex.Message, , "Sub queryDatbase - module WorkWithBase")
        End Try

        ' создаём DataAdapter
        da = New OleDb.OleDbDataAdapter(str_queryString, con)

    End Sub

    Sub fillDataSet(ByRef tblName As String)

        'Try
        '    ds.Tables(tblName).Reset()
        ds.Clear()
        'ds.Reset()
        '    ds.Tables.Add(tblName)
        'Catch ex As Exception

        'End Try

        Try
            Application.DoEvents()
            da.Fill(ds, tblName)
        Catch ex As Exception
            MsgBox(ex.Message, , "Sub fillDataSet - module WorkWithBase")
        End Try

    End Sub

    Sub saveToDatabase(ByRef tblName As String, dsNewRow As DataRow)
        '**********************************************************************************************************"
        '
        '**********************************************************************************************************"
        ' Создаём объект CommandBuilder:
        Dim cb As New OleDb.OleDbCommandBuilder(da)

        ' Создаём объект DataRow (в него поместим новую строку, которую добавим в таблицу):
        ' Dim dsNewRow As DataRow

        ' tblName = frmMain
        ' Заносим в объект dsnNewRow пустую строку в формате строк таблицы AddressBook:
        ' dsNewRow = ds.Tables(tblName).NewRow()

        ' Вносим в DataSet(AddressBook) новую строку:
        ds.Tables(tblName).Rows.Add(dsNewRow)

        ' С помощью DataAdapter 'da.Update' сохраняем изменённый Dataset в БД:
        da.Update(ds, tblName)

        ' Очищаем DataSet:
        ds.Clear()

        ' Обновляем набор данных в DataSet, так как мы добавили новую строку:
        da.Fill(ds, tblName)

        cb = Nothing
        dsNewRow = Nothing

    End Sub

    Sub updateDataBase(ByRef tblName As String) 'ByRef int_RowNumber As Integer, ByRef Arr() As String)
        ' Если база пуста - выходим из подпрограммы:
        If ds.Tables(tblName).Rows.Count = 0 Then
            Exit Sub
        End If

        ' Создаём объект CommandBuilder:
        Dim cb As New OleDb.OleDbCommandBuilder(da)

        Try
            da.Update(ds, tblName)
        Catch ex As Exception
            MsgBox(ErrorToString)
        End Try

        cb = Nothing

    End Sub

    Sub deleteFromDatabase(ByRef int_RowIndex As Integer, ByRef tblName As String)

        ' Если база пуста, сообщаем об этом и выходим из подпрограммы ничего не удалив:
        If ds.Tables(tblName).Rows.Count = 0 Then
            ShowDialogWindow("В базе данных нет ни одной записи, удалять нечего", "База данных пуста", "Я понял", "Точно понял")
            Exit Sub
        End If

        ' Задашиваем подтверждение удаления строки из БД:
        Dim retVal As Byte
        retVal = ShowDialogWindow("Удаление записи из БД", "Вы действительно хотите удалить запись из БД?", "Удалить", "Не удалять")
        If retVal = 2 Then Exit Sub

        Dim cb As New OleDb.OleDbCommandBuilder(da)  ' Создаём объект CommandBuilder

        Try
            ds.Tables(tblName).Rows(int_RowIndex).Delete() ' Удаляем строку из таблицы
            'int_MaxRows = int_MaxRows - 1 ' Уменьшаем количество строк в таблице на 1

            da.Update(ds, tblName) ' Сохраняем изменения в БД
        Catch
            MsgBox(ErrorToString)
        End Try

        cb = Nothing ' Удаляем объект CommandBuilder

    End Sub

    Function ShowDialogWindow(ByRef FormCaption As String, MessageText As String, OK_ButtonText As String, Cancel_ButtonText As String) As Byte
        ' Функция вызывает диалоговое окно с настраиваемым текстом

        Dim retVal As Byte ' retVal = 1 OK; retVal = 2 Cancel
        dlgWindow.Text = FormCaption
        dlgWindow.Label1.Text = MessageText
        dlgWindow.OK_Button.Text = OK_ButtonText
        dlgWindow.Cancel_Button.Text = Cancel_ButtonText
        retVal = CByte(dlgWindow.ShowDialog())
        Return retVal

    End Function

    Function datagridfilter(ByRef strFilter As String) As Integer

        Dim dv As DataView
        dv = New DataView(ds.Tables(tblName))

        If strFilter = "" Then
            dv.RowFilter = [String].Empty
            dv.RowFilter = "Название LIKE '%'"
            Return 0
            Exit Function
        End If

        dv.RowFilter = [String].Empty
        dv.RowFilter = "Название LIKE '" + strFilter + "%'"
        'dv = New DataView(ds.Tables(tblName), "Название LIKE 'ночное такс'", "Название Desc", DataViewRowState.CurrentRows)
        'frmMain.dgvMain.DataSource = dv

        Dim aaa = 0
        Return 0
    End Function

    Function searchInDB(ByRef queryString As String, tblName As String) As String

        Dim str_SearchString As String = Nothing
        Dim dbProvider As String = Nothing
        Dim dbSource As String = Nothing

        ' меняем в запросе некорректные символы:
        'queryString = removeBadCharsFromString(queryString)

        ' формируем запрос к БД
        ' ЗАПРОСЫ ДОЛЖНЫ КОНСТРУИРОВАТЬСЯ ВЫЗЫВАЮЩЕЙ ПОДПРОГРАММОЙ
        str_SearchString = queryString ' "SELECT * FROM Songs WHERE SongName" ' LIKE '%" + queryString + "%' OR SingerName LIKE '%" + queryString + "%' ORDER BY SongName"

        ' Объявляем провайдера для работы с MS Access БД:
        dbProvider = "PROVIDER=Microsoft.Jet.OLEDB.4.0;"

        ' Указываем путь до файла БД:
        dbSource = "Data Source = " & Application.StartupPath & "\db\Songs.mdb"

        ' Открываем базу данных
        openDatabase(dbProvider, dbSource)

        ' Выбираем данные по SQL-запросу из БД:
        connectToDB(str_SearchString)

        ' Заполняем выбранными из БД данными DataSet и присваиваем DataSet имя BazaPesen:
        'tblName = "BazaPesen"
        fillDataSet(tblName)

        ' Закрываем соединение с базой данных:
        closeDatabase()

        Return str_SearchString

    End Function

    Function removeBadCharsFromString(ByRef str_String As String) As String

        ' меняем в запросе некорректные символы  на приемлемые:
        ' 1 что менять, 2 на что менять
        Dim strToReplace() As String = {"ё", "е", "Ё", "Е", "'", "##", "–", "-", vbCrLf, "", vbCr, "",
                                         vbNewLine, "", "_", " "}

        For i = 0 To UBound(strToReplace) - 1 Step 2
            str_String = str_String.Replace(strToReplace(i), strToReplace(i + 1))
        Next

        If str_String = Nothing Then str_String = ""

        Return str_String

    End Function

End Module


Выполняет все базовые операции с БД, добавление, удаление, поиск (реализован выборкой в Датасет SQL-запросом, что мне не нравится особо, но работает), а также обновление записи в базе.
Вопросы будут - постараюсь ответить.
Имейте ввиду, код очень "рабочий", то есть в настоящий момент я его постоянно правлю. Поэтому сейчас в нём дофига закомментированных кусков кода, которые, в принципе, не нужны. Просто пока я их не вычищал.
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Re: Добавление записей в БД accdb

Сообщение MEMBER » 14.01.2015 (Ср) 20:21

В принципе всё равно собирался оформлять самому себе "шпаргалку" по БД. Напишу пример - выложу.
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

AndrNet
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 08.06.2009 (Пн) 9:09

Re: Добавление записей в БД accdb

Сообщение AndrNet » 14.01.2015 (Ср) 21:06

Через Jet.OLEDB.4.0 не работает с accdb уже пробовал.
Я вообще думал NET может что-то типа.
Adodc2.Recordset.AddNew
Adodc2.Recordset![FIO] = UCase(txtNewEl.Text)
думаю, что должно быть решение подобное этому.

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Re: Добавление записей в БД accdb

Сообщение MEMBER » 14.01.2015 (Ср) 21:47

Пока, чтобы не скучать, пример открытия БД, выборки из БД по SQL-запросу, заполнения DataGridView данными, выборки данных из DataSet в текстбоксы.

Проект VS_2010. Надеюсь 2012 умеет их конвертировать.
Вложения
Шпаргалка по БД.zip
(610.64 Кб) Скачиваний: 450
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Re: Добавление записей в БД accdb

Сообщение MEMBER » 14.01.2015 (Ср) 22:19

AndrNet писал(а):accdb


Для accdb провайдер такой:
Provider=Microsoft.ACE.OLEDB.12.0;

В примере есть "косяк" - при сортировке кликом по заголовку столбца DataGridVew отдаваемые в текстбоксы значения не соответствуют записям в датагрид, так как датасет не привязан к датагрид и сортировка меняет лишь отображение информации в датагрид, а сам датасет не трогает.
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

AndrNet
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 08.06.2009 (Пн) 9:09

Re: Добавление записей в БД accdb

Сообщение AndrNet » 14.01.2015 (Ср) 23:51

Вот спасибо! Я хоть с мертвой точки сдвинулся.

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Re: Добавление записей в БД accdb

Сообщение MEMBER » 15.01.2015 (Чт) 1:11

Добавлен:
- поиск (вернее выборка из БД по поисковому запросу)
- удаление записи
- добавление записи
- теперь DataGrid связан с DataSet, поэтому при сортировке DataGrid нажатием на заголовки столбцов, в текстбоксы приходят верные значения, а не что придётся.
Вложения
Шпаргалка по БД.zip
(653.09 Кб) Скачиваний: 450
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

AndrNet
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 08.06.2009 (Пн) 9:09

Re: Добавление записей в БД accdb

Сообщение AndrNet » 15.01.2015 (Чт) 19:56

А почему не работает этот интерактивный поиск?
Код: Выделить всё
Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
        ClientBindingSource.Filter = "VIN  Like  '%" & TextBox1.Text & "%'"
    End Sub

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Re: Добавление записей в БД accdb

Сообщение MEMBER » 16.01.2015 (Пт) 1:26

+ добавлен фильтр (BindingSource.Filter)
Вложения
Шпаргалка по БД.zip
(655.47 Кб) Скачиваний: 461
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

AndrNet
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 08.06.2009 (Пн) 9:09

Re: Добавление записей в БД accdb

Сообщение AndrNet » 17.01.2015 (Сб) 20:56

Вот молодец!!! Спасибо огромное!

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Re: Добавление записей в БД accdb

Сообщение MEMBER » 17.01.2015 (Сб) 23:03

Да это вам спасибо. Без вас я бы прочитал кучу материала в поисках метода фильтрации датасета (почему-то сам датасет не хочет фильтроваться), а вы мне такой клёвый BindingSource.Filter подкинули. Так что спасибо нам обоим! :)
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com


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

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

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

    TopList