Member 11383115 Ответов: 3

Как мне...обновить свою базу данных access


как я могу обновить свою базу данных access в vb.net код я использую OleDb соединение с базой данных это сделать изменение в datagridview но не в базу данных
Public Sub executquery()
        Dim commandOleDb As New OleDbCommand(query, con)
        commandOleDb.ExecuteNonQuery()
        con.Close()
    End Sub
--------------------
    Private Sub ButtonInsert_Click(sender As Object, e As EventArgs)
        Dim con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\Almaashat.accdb")
        Dim query As String
        Try
            con.Open()
            query = "INSERT INTO Techers (File_ID,Name,Workplace,Jop,Appointment,Class,Birthday,End_date,End_class,End_for,Note) VALUES (" & TextBoxFile_ID.Text & " ,'" & TextBoxName.Text & "' ,'" & TextBoxWorkplace.Text & "' ,'" & TextBoxJop.Text & "'  ,'" & DateTimePickerAppoiment.Text & "','" & TextBoxClass.Text & "','" & DateTimePickerBirthday.Text & "' ,'" & DateTimePickerEnd_date.Text & "' ,'" & TextBoxEnd_class.Text & "','" & TextBoxEnd_for.Text & "' ,'" & TextBoxNote.Text & "')"
            executquery()
            con.Close()
            MsgBox("Your Data Inserted")
        Catch ex As Exception
            MsgBox("Your Data Not Inserted")
        End Try
        TechersDataGridView.DataSource = TechersBindingSource
           End Sub


Что я уже пробовал:

Public Sub executquery()
        Dim commandOleDb As New OleDbCommand(query, con)
        commandOleDb.ExecuteNonQuery()
        con.Close()
    End Sub
    Private Sub ButtonInsert_Click(sender As Object, e As EventArgs)
        Dim con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\Almaashat.accdb")
        Dim query As String
        Try
            con.Open()
            query = "INSERT INTO Techers (File_ID,Name,Workplace,Jop,Appointment,Class,Birthday,End_date,End_class,End_for,Note) VALUES (" & TextBoxFile_ID.Text & " ,'" & TextBoxName.Text & "' ,'" & TextBoxWorkplace.Text & "' ,'" & TextBoxJop.Text & "'  ,'" & DateTimePickerAppoiment.Text & "','" & TextBoxClass.Text & "','" & DateTimePickerBirthday.Text & "' ,'" & DateTimePickerEnd_date.Text & "' ,'" & TextBoxEnd_class.Text & "','" & TextBoxEnd_for.Text & "' ,'" & TextBoxNote.Text & "')"
            executquery()
            con.Close()
            MsgBox("تم الإدخال بنجاح")
        Catch ex As Exception
            MsgBox("لم يتم الإدخال بنجاح")
        End Try
        TechersDataGridView.DataSource = TechersBindingSource
           End Sub

3 Ответов

Рейтинг:
1

OriginalGriff

Только не это! Никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

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

Исправьте это и обратите внимание, что query внутри вашего метода ButtonInsert_Click находится локальная переменная, поэтому он никоим образом не связан с query внутри вашего executquery метод.

И сделайте себе одолжение - не надо жестко кодировать строки подключения! Они всегда должны быть в конфигурационных файлах, поэтому вам не нужно менять программное обеспечение и перекомпилировать его для каждой новой установки.


Рейтинг:
0

Maciej Los

Никогда не используйте конкатенированную строку из-за SQL-инъекции.
Немного информации о SQL инъекции и способе как это сделать правильно описано здесь: Запись не вставляется в базу данных ms access[^]


Рейтинг:
0

Bryian Tan

Судя по опубликованному коду, похоже, что это может быть проблема в функции executquery ().

1. не ясно, как заполняются переменные "query" и "con".

Либо переместите эти две строки за пределы функции button click, либо передайте эти переменные в executquery()

Dim query As String
Dim con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\Almaashat.accdb")


Кстати, почему бы не сделать это просто и не оставить эти две строки в функции нажатия кнопки?

Dim commandOleDb As New OleDbCommand(query, con)
        commandOleDb.ExecuteNonQuery()


После того, как вы получили его на работу, то вы можете посмотреть на использование параметризованного запроса
Добавление и сохранение записей для доступа к базе данных с помощью VB.NET | бесплатный исходный код, учебные пособия и статьи[^]