BassamKassem Ответов: 2

Я столкнулся с проблемой при вставке данных в файл mdb


Я получаю синтаксическую ошибку в инструкции INSERT INTO , и причина скрыта для меня, я отладил все это с прошлого четверга, и до сих пор нет веской причины, почему я получаю эту ошибку

Am facing a problem while inserting data to mdb file

Public Class SuppliersManagement
    Dim cnnOLEDB As New OleDbConnection
    Dim cmdOLEDB As New OleDbCommand
    Dim cmdInsert As New OleDbCommand
    Dim cmdUpdate As New OleDbCommand
    Dim cmdDelete As New OleDbCommand
    Dim SystemUserName As String = Environment.UserName
    Dim strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & System.Environment.CurrentDirectory & "\SupplierDB.mdb"


Private Sub Fill_Suppliers_Data()
    Try
        Dim sqlQRY As String
        sqlQRY = "Select * From Supp_Users"
        Dim da As OleDbDataAdapter
        Dim ds As DataSet = New DataSet
        da = New OleDbDataAdapter(sqlQRY, cnnOLEDB)
        Dim cb As OleDbCommandBuilder = New OleDbCommandBuilder(da)
        da.Fill(ds, "Supp_Users")
        DataGridSupplierMGT.DataSource = ds
        DataGridSupplierMGT.DataMember = "Supp_Users"
        lbl_RowCount.Text = DataGridSupplierMGT.RowCount
        Dim row As Integer
        If DataGridSupplierMGT.RowCount > 0 Then
            DataGridSupplierMGT.Columns("Supp_UserName").ReadOnly = True
            DataGridSupplierMGT.Columns("EmailTo").Visible = False
            DataGridSupplierMGT.Columns("EmailCC").Visible = False
            DataGridSupplierMGT.Columns("Password").Visible = False
            DataGridSupplierMGT.Columns("Supp_Domain").Visible = False
            DataGridSupplierMGT.Columns("ID").Visible = False
            row = DataGridSupplierMGT.FirstDisplayedCell.RowIndex
            DataGridSupplierMGT.Rows(row).Selected = True
            If RowIndex_TXT.Text = vbNullString Then
                Exit Sub
            Else
                Me.DataGridSupplierMGT.ClearSelection()
                Me.DataGridSupplierMGT.Rows(RowIndex_TXT.Text).Selected = True
                Me.DataGridSupplierMGT.FirstDisplayedScrollingRowIndex = RowIndex_TXT.Text
            End If
        Else
            row = 0
        End If
    Catch ex As OleDbException
        MessageBox.Show(ex.Message)
    End Try
End Sub




Private Sub AddNew_BTN_Click(sender As Object, e As EventArgs) Handles AddNew_BTN.Click
        Try
            If RecordID_TXT.Text = "" Then
                If MessageBox.Show("Do you want to Add a New Record?", "Insert", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) = DialogResult.No Then
                    Exit Sub
                Else
                    If SuppNameVariable.Text <> "" And Supp_domain_TXT.Text <> "" And Supp_Pass_TXT.Text <> "" And MailAdress_Holder_TXT_TO.Text <> "" And MailAdress_Holder_TXT_CC.Text <> "" Then
                        If cnnOLEDB.State = ConnectionState.Open Then
                            cnnOLEDB.Close()
                        End If
                        cnnOLEDB.Open()
                        cmdInsert.CommandText = "INSERT INTO Supp_Users (Supp_UserName, Supp_Domain, Password, EmailTo, EmailCC) VALUES ('" & SuppNameVariable.Text & "', '" & Supp_domain_TXT.Text & "', '" & Supp_Pass_TXT.Text & "', '" & MailAdress_Holder_TXT_TO.Text & "', '" & MailAdress_Holder_TXT_CC.Text & "');"
                        cmdInsert.CommandType = CommandType.Text
                        cmdInsert.Connection = cnnOLEDB
                        cmdInsert.ExecuteNonQuery()
                        MsgBox("Record added successfully.")
                        RecordID_TXT.Text = ""
                        SuppNameVariable.Text = ""
                        Supp_domain_TXT.Text = ""
                        Supp_Pass_TXT.Text = ""
                        MailAdress_Holder_TXT_TO.Text = ""
                        MailAdress_Holder_TXT_CC.Text = ""
                        lbl_RowCount.Text = DataGridSupplierMGT.RowCount
                    Else
                        MsgBox("Please make sure to add below data:" & vbNewLine & "1. Supplier Name" & vbNewLine & "2. Supplier Domain" & vbNewLine & "3. Supplier Password" & vbNewLine & "4. Email To" & vbNewLine & "5. Email CC")
                        lbl_RowCount.Text = DataGridSupplierMGT.RowCount
                    End If
                End If
            End If
            lbl_RowCount.Text = DataGridSupplierMGT.RowCount
            cmdInsert.Dispose()
            Fill_Suppliers_Data()
            If DataGridSupplierMGT.RowCount > 0 Then
                DataGridSupplierMGT.ClearSelection()
                Me.DataGridSupplierMGT.FirstDisplayedScrollingRowIndex = Me.DataGridSupplierMGT.RowCount - 1
                Me.DataGridSupplierMGT.Rows(Me.DataGridSupplierMGT.RowCount - 1).Selected = True
            End If
        Catch ex As OleDbException
            MessageBox.Show(ex.Message)
        End Try
End Sub


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

Am facing a problem while inserting data to mdb file

Public Class SuppliersManagement
    Dim cnnOLEDB As New OleDbConnection
    Dim cmdOLEDB As New OleDbCommand
    Dim cmdInsert As New OleDbCommand
    Dim cmdUpdate As New OleDbCommand
    Dim cmdDelete As New OleDbCommand
    Dim SystemUserName As String = Environment.UserName
    Dim strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & System.Environment.CurrentDirectory & "\SupplierDB.mdb"


Private Sub Fill_Suppliers_Data()
    Try
        Dim sqlQRY As String
        sqlQRY = "Select * From Supp_Users"
        Dim da As OleDbDataAdapter
        Dim ds As DataSet = New DataSet
        da = New OleDbDataAdapter(sqlQRY, cnnOLEDB)
        Dim cb As OleDbCommandBuilder = New OleDbCommandBuilder(da)
        da.Fill(ds, "Supp_Users")
        DataGridSupplierMGT.DataSource = ds
        DataGridSupplierMGT.DataMember = "Supp_Users"
        lbl_RowCount.Text = DataGridSupplierMGT.RowCount
        Dim row As Integer
        If DataGridSupplierMGT.RowCount > 0 Then
            DataGridSupplierMGT.Columns("Supp_UserName").ReadOnly = True
            DataGridSupplierMGT.Columns("EmailTo").Visible = False
            DataGridSupplierMGT.Columns("EmailCC").Visible = False
            DataGridSupplierMGT.Columns("Password").Visible = False
            DataGridSupplierMGT.Columns("Supp_Domain").Visible = False
            DataGridSupplierMGT.Columns("ID").Visible = False
            row = DataGridSupplierMGT.FirstDisplayedCell.RowIndex
            DataGridSupplierMGT.Rows(row).Selected = True
            If RowIndex_TXT.Text = vbNullString Then
                Exit Sub
            Else
                Me.DataGridSupplierMGT.ClearSelection()
                Me.DataGridSupplierMGT.Rows(RowIndex_TXT.Text).Selected = True
                Me.DataGridSupplierMGT.FirstDisplayedScrollingRowIndex = RowIndex_TXT.Text
            End If
        Else
            row = 0
        End If
    Catch ex As OleDbException
        MessageBox.Show(ex.Message)
    End Try
End Sub




Private Sub AddNew_BTN_Click(sender As Object, e As EventArgs) Handles AddNew_BTN.Click
        Try
            If RecordID_TXT.Text = "" Then
                If MessageBox.Show("Do you want to Add a New Record?", "Insert", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) = DialogResult.No Then
                    Exit Sub
                Else
                    If SuppNameVariable.Text <> "" And Supp_domain_TXT.Text <> "" And Supp_Pass_TXT.Text <> "" And MailAdress_Holder_TXT_TO.Text <> "" And MailAdress_Holder_TXT_CC.Text <> "" Then
                        If cnnOLEDB.State = ConnectionState.Open Then
                            cnnOLEDB.Close()
                        End If
                        cnnOLEDB.Open()
                        cmdInsert.CommandText = "INSERT INTO Supp_Users (Supp_UserName, Supp_Domain, Password, EmailTo, EmailCC) VALUES ('" & SuppNameVariable.Text & "', '" & Supp_domain_TXT.Text & "', '" & Supp_Pass_TXT.Text & "', '" & MailAdress_Holder_TXT_TO.Text & "', '" & MailAdress_Holder_TXT_CC.Text & "');"
                        cmdInsert.CommandType = CommandType.Text
                        cmdInsert.Connection = cnnOLEDB
                        cmdInsert.ExecuteNonQuery()
                        MsgBox("Record added successfully.")
                        RecordID_TXT.Text = ""
                        SuppNameVariable.Text = ""
                        Supp_domain_TXT.Text = ""
                        Supp_Pass_TXT.Text = ""
                        MailAdress_Holder_TXT_TO.Text = ""
                        MailAdress_Holder_TXT_CC.Text = ""
                        lbl_RowCount.Text = DataGridSupplierMGT.RowCount
                    Else
                        MsgBox("Please make sure to add below data:" & vbNewLine & "1. Supplier Name" & vbNewLine & "2. Supplier Domain" & vbNewLine & "3. Supplier Password" & vbNewLine & "4. Email To" & vbNewLine & "5. Email CC")
                        lbl_RowCount.Text = DataGridSupplierMGT.RowCount
                    End If
                End If
            End If
            lbl_RowCount.Text = DataGridSupplierMGT.RowCount
            cmdInsert.Dispose()
            Fill_Suppliers_Data()
            If DataGridSupplierMGT.RowCount > 0 Then
                DataGridSupplierMGT.ClearSelection()
                Me.DataGridSupplierMGT.FirstDisplayedScrollingRowIndex = Me.DataGridSupplierMGT.RowCount - 1
                Me.DataGridSupplierMGT.Rows(Me.DataGridSupplierMGT.RowCount - 1).Selected = True
            End If
        Catch ex As OleDbException
            MessageBox.Show(ex.Message)
        End Try
End Sub

2 Ответов

Рейтинг:
2

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;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

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

Скорее всего, когда вы исправите это, ваша другая проблема исчезнет в то же самое время.


BassamKassem

Спасибо за Вашу постоянную поддержку , я пробовал это, но все еще не работает донно почему

Частная суб обработчика button1_click(отправителя как объект, а равно EventArgs) обрабатывает кнопки button1.Щелчок
Попробуй
Используя связи в качестве объекта oledbconnection = параметр "createconnection"()
Использование cmdInsert в качестве OleDbCommand = connection.CreateCommand()
Если RecordID_TXT.Текст = "" Тогда
Если MessageBox.Show("вы хотите добавить новую запись?", "вставить", MessageBoxButtons.Да Нет, MessageBoxIcon.Предупреждение) = DialogResult.Не То
Выход Из Субмарины
Еще
'cmdInsert.Свойства commandtext = "вставить в Supp_Users (Supp_UserName, Supp_Domain, пароль EmailTo, EmailCC) значения (@Supp_UserName = ?, @Supp_Domain = ?, @Пароль = ?, @EmailTo = ?, @EmailCC = ?)"
cmdInsert.Свойства Commandtext = "Вставить В Supp_Users (Supp_UserName, Supp_Domain, Пароль EmailTo, EmailCC) Значения (@Supp_UserName, @Supp_Domain, @Пароль, @EmailTo, @EmailCC)"
cmdInsert.Parameters.AddWithValue("Supp_UserName", SuppNameVariable.Текст)
cmdInsert.Parameters.AddWithValue("Supp_Domain", Supp_domain_TXT.Text)
cmdInsert.Parameters.AddWithValue("Пароль", Supp_Pass_TXT.Text)
cmdInsert.Parameters.AddWithValue("EmailTo", MailAdress_Holder_TXT_TO.Text)
cmdInsert.Parameters.AddWithValue("EmailCC", MailAdress_Holder_TXT_CC.Text)
cmdInsert.Метод executenonquery()
MsgBox("запись успешно добавлена.")
RecordID_TXT.Текст = ""
SuppNameVariable.Текст = ""
Supp_domain_TXT.Текст = ""
Supp_Pass_TXT.Текст = ""
MailAdress_Holder_TXT_TO.Текст = ""
MailAdress_Holder_TXT_CC.Текст = ""
lbl_RowCount.Text = DataGridSupplierMGT.Количество строк
Конец, Если
Еще
С помощью MsgBox("пожалуйста, не забудьте добавить ниже данных:" &амп; vbNewLine &ампер; "1. Имя" &амп поставщик; vbNewLine &ампер; "2. "Домена & поставщика; vbNewLine &ампер; "3. Пароль" &амп поставщик; vbNewLine &ампер; "4. Написать" &амп; vbNewLine &ампер; "5. ЦК email")
lbl_RowCount.Text = DataGridSupplierMGT.Количество строк
Конец, Если
Конец Использования
Конец Использования
Поймать ex как OleDbException
'TODO: запишите где-нибудь полную информацию об исключении:
Система.Диагностика.След.Свойства traceerror(исх.Метод toString())
Ящик для сообщений.Показать(напр.сообщение)
Конец Попытки
Конец Подводной Лодки

Рейтинг:
0

BassamKassem

Я сделал его таким, и он работает просто отлично

1 - я изменил имя файла "пароль" в MS Access, чтобы оно было "Supp_Password", затем я удалил его замаскированный элемент "пароль" и сделал текстовое поле с именем "

Supp_Pass_TXT
чтобы не отображать фактические символы и отображать их как *** из своих свойств

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Try
        Using connection As OleDbConnection = CreateConnection()
            Using cmdInsert As OleDbCommand = connection.CreateCommand()
                If RecordID_TXT.Text = "" Then
                    If MessageBox.Show("Do you want to Add a New Record?", "Insert", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) = DialogResult.No Then
                        Exit Sub
                    Else
                        cmdInsert.CommandText = "INSERT INTO Supp_Users (Supp_UserName, Supp_Domain, Supp_Password, EmailTo, EmailCC) VALUES (@Supp_UserName, @Supp_Domain, @Supp_Password, @EmailTo, @EmailCC)"
                        cmdInsert.Parameters.AddWithValue("@Supp_UserName", SuppNameVariable.Text)
                        cmdInsert.Parameters.AddWithValue("@Supp_Domain", Supp_domain_TXT.Text)
                        cmdInsert.Parameters.AddWithValue("@Supp_Password", Supp_Pass_TXT.Text)
                        cmdInsert.Parameters.AddWithValue("@EmailTo", MailAdress_Holder_TXT_TO.Text)
                        cmdInsert.Parameters.AddWithValue("@EmailCC", MailAdress_Holder_TXT_CC.Text)
                        cmdInsert.ExecuteNonQuery()
                        MsgBox("Record added successfully.")
                        RecordID_TXT.Text = ""
                        SuppNameVariable.Text = ""
                        Supp_domain_TXT.Text = ""
                        Supp_Pass_TXT.Text = ""
                        MailAdress_Holder_TXT_TO.Text = ""
                        MailAdress_Holder_TXT_CC.Text = ""
                        lbl_RowCount.Text = DataGridSupplierMGT.RowCount
                        Fill_Suppliers_Data()
                    End If
                Else
                    MsgBox("Please make sure to add below data:" & vbNewLine & "1. Supplier Name" & vbNewLine & "2. Supplier Domain" & vbNewLine & "3. Supplier Password" & vbNewLine & "4. Email To" & vbNewLine & "5. Email CC")
                    lbl_RowCount.Text = DataGridSupplierMGT.RowCount
                    Fill_Suppliers_Data()
                End If
            End Using
        End Using
    Catch ex As OleDbException
        ' TODO: Log the full exception details somewhere:
        System.Diagnostics.Trace.TraceError(ex.ToString())
        MessageBox.Show(ex.Message)
    End Try