Почему я получаю синтаксическую ошибку о INSERT INTO?

#vb.net

#vb.net

Вопрос:

У меня проблема с запуском моего приложения Visual Basic. Я получаю syntax error INSERT INTO , когда пытаюсь добавить данные в свой DataGridView.

Вот приведенный ниже код, можете ли вы сказать мне, что с ним не так?

 Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    Dim cmd As New OleDb.OleDbCommand
    If Not cnn.State = ConnectionState.Open Then
        'open connection if it is not already opened
        cnn.Open()
    End If
    'new connection
    cmd.Connection = cnn
    'check whether to add new or update
    If Me.txtEmployeeID.Tag amp; "" = "" Then
        'add new 
        'add new data to table
        cmd.CommandText = "INSERT INTO Attendance(EmployeeID, FirstName, LastName, Date, Holiday, HalfDay, Other, Sick, UnpaidHoliday, DaysTaken, DateFrom, DateTo) " amp; _
        " VALUES(" amp; Me.txtEmployeeID.Text amp; ",'" amp; Me.txtFirstName.Text amp; "','" amp; Me.txtLastName.Text amp; "','" amp; Me.txtdate.Text amp; "','" amp; Me.txtHoliday.Text amp; "','" amp; Me.txtHalfDay.Text amp; "','" amp; Me.txtOther.Text amp; "','" amp; Me.txtSick.Text amp; "','" amp; _
        Me.txtUnpaidHoliday.Text amp; "','" amp; Me.txtDaysTaken.Text amp; "','" amp; _
        Me.DateTimePicker2.Text amp; "','" amp; Me.DateTimePicker1.Text amp; "')"
        cmd.ExecuteNonQuery()
    Else
        'update data in table and execute
        cmd.CommandText = "UPDATE Attendance" amp; _
            " SET EmployeeID =" amp; Me.txtEmployeeID.Text amp; _
            ", FirstName ='" amp; Me.txtFirstName.Text amp; "'" amp; _
            ", LastName ='" amp; Me.txtLastName.Text amp; "'" amp; _
            ", Date ='" amp; Me.txtdate.Text amp; "'" amp; _
            ", Holiday ='" amp; Me.txtHoliday.Text amp; "'" amp; _
            ", HalfDay='" amp; Me.txtHalfDay.Text amp; "'" amp; _
            ", Other='" amp; Me.txtOther.Text amp; "'" amp; _
            ", Unpaidholiday='" amp; Me.txtUnpaidHoliday.Text amp; "'" amp; _
            ", DaysTaken='" amp; Me.txtDaysTaken.Text amp; "'" amp; _
            ", DateFrom='" amp; Me.DateTimePicker1.Text amp; "'" amp; _
            ", DateTo='" amp; Me.DateTimePicker2.Text amp; "'" amp; _
            " WHERE employeeID =" amp; Me.txtEmployeeID.Tag
        cmd.ExecuteNonQuery()
    End If
    'refresh data in table list
    refreshdata()
    'clear form
    Me.btnclear.PerformClick()
    'close connection
    cnn.Close()
End Sub
 

Комментарии:

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

Ответ №1:

Проблема заключается в слове DATE, которое во многих базах данных является зарезервированным ключевым словом. Вы должны заключить это в квадратные скобки

   cmd.CommandText = "INSERT INTO Attendance(EmployeeID, FirstName, LastName, [Date], " amp; _
                    "Holiday, HalfDay, Other, Sick, UnpaidHoliday, DaysTaken, DateFrom, " amp; _
                    "DateTo) " .......
 

Но здесь у вас проблема посерьезнее. Объединение строк для формирования текста команды sql — идеальный рецепт катастроф. Sql-инъекции и проблемы с синтаксическим анализом здесь ждут вашей команды. Всегда используйте параметризованный запрос

Итак, просто в качестве примера

   cmd.CommandText = "INSERT INTO Attendance(EmployeeID, FirstName, LastName, [Date], " amp; _
                    "Holiday, HalfDay, Other, Sick, UnpaidHoliday, DaysTaken, DateFrom, " amp; _
                    "DateTo) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)";
  cmd.Parameters.AddWithValue("@p1", Me.txtEmployeeID.Text)
  ..... and so on for the other eleven parameters.....
  ..... add them in the exact order in which they appear in the parameter list ....
  cmd.ExecuteNonQuery()
 

Комментарии:

1. Не забудьте обновить свой код, чтобы использовать параметры. Помимо Sql-инъекции, как вы думаете, что произойдет, если Me.txtLastName . Текст содержит имя с одинарной кавычкой? O'Brian например….

Ответ №2:

Date это зарезервированное слово в T-SQL, поэтому вам нужно будет заключить его в квадратные скобки:

 cmd.CommandText = "INSERT INTO Attendance(EmployeeID, FirstName, LastName, [Date], Holiday, HalfDay, Other, Sick, UnpaidHoliday, DaysTaken, DateFrom, DateTo) " amp; _
            " VALUES(" amp; Me.txtEmployeeID.Text amp; ",'" amp; Me.txtFirstName.Text amp; "','" amp; Me.txtLastName.Text amp; "','" amp; Me.txtdate.Text amp; "','" amp; Me.txtHoliday.Text amp; "','" amp; Me.txtHalfDay.Text amp; "','" amp; Me.txtOther.Text amp; "','" amp; Me.txtSick.Text amp; "','" amp; _
            Me.txtUnpaidHoliday.Text amp; "','" amp; Me.txtDaysTaken.Text amp; "','" amp; _
            Me.DateTimePicker2.Text amp; "','" amp; Me.DateTimePicker1.Text amp; "')"
 

Ответ №3:

Какую ошибку вы получаете? Если EmployeeID является столбцом идентификатора, вы не можете явно вставить в него значение.