#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 является столбцом идентификатора, вы не можете явно вставить в него значение.