2012-06-27 3 views
1

У меня есть ошибка при выполнении моего кода. Он говорит «Ошибка синтаксиса в инструкции INSERT INTO». Это мой код:ошибка в кнопке отправки

Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click GridView1.Visible = True 

Dim myConn As OleDbConnection  
Dim sqlString, takenby, dest, client, car As String  
Dim recordno As Integer  
Dim dte, exptime As String  
recordno = TextBox4.Text  
dte = TextBox1.Text  
car = ComboBox1.SelectedValue.ToString()  
takenby = ComboBox2.SelectedValue.ToString  
dest = ComboBox3.SelectedValue.ToString  
client = TextBox2.Text  
exptime = TextBox3.Text  
myConn = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\student\WebSite3\App_Data\Database.mdb;Persist Security Info=False;")  
myConn.Open()  
sqlString = "INSERT INTO DETAILED GISTEC CARS(Record No, Date, Car, Taken By, Destination, Client, Expected Time to Return)VALUES(?recordno, ?dte, ?car, ?takenby, ?dest, ?client, ?exptime);"  
Dim cmd = New OleDbCommand(sqlString, myConn)  
cmd.ExecuteNonQuery()  
myConn.Close() 

End Sub 
+0

Отредактировано для повышения удобочитаемости кода. –

+0

Вы отметили этот VB6, но код, который вы отправили, является VB.NET - это он? –

ответ

0

Попробуйте выполнить запрос непосредственно в Access до тех пор, пока он не будет работать.

Отсюда выглядит

  • У вас нет пространства вокруг ЗНАЧЕНИЯ
  • Ваше имя таблицы содержат пробелы, так что лучше использовать [], чтобы окружить имя таблицы
  • То же с некоторыми именами столбцов.
  • Не уверены? Recordno синтаксиса VB так лучшего использование оператора +

sqlString = "INSERT INTO [DETAILED GISTEC CARS]([Record No], [Date], [Car], [Taken By], [Destination], [Client], [Expected Time to Return]) VALUES (" + recordno + ", " + dte + ", " + car +", " + takenby, " + dest + ", " + client + ", " + exptime + ");"

+0

Я пытался использовать? и даже @, но это dsnt работает .... любая идея? проблема всегда выполняется. Что вы имеете в виду выполнить запрос непосредственно в доступе? Как я могу это сделать? – Tahany90

+0

Лучше использовать конкатенацию строк, как я положил. (Только что отредактирован). Ищите контент sqlstring и публикуйте его здесь, чтобы я мог видеть окончательный контент. Вы также можете выполнить в ms-доступе вы можете напрямую открыть файл доступа (проверьте это [ссылка] (http://office.microsoft.com/en-us/access-help/run-a-query-HA010077157.aspx) на см., как это сделать) –

+1

Я слышал, как кто-то сказал [Bobby Tables] (http://bobby-tables.com/)? –

0

альтернатива метода конкатенации Cad будет заключаться в фигурных скобках заполнителей массива. Что-то вроде этого следует сделать это:

sqlString = String.Format("INSERT INTO [DETAILED GISTEC CARS] ([Record No], [Date], [Car], [Taken By], [Destination], [Client], [Expected Time to Return]) VALUES ({0}, {1}, {2}, {3}, {4}, {5}, {6});", recordno, dte, car, takenby, dest, client, exptime) 

Вы также должны поставить одинарные кавычки без числовых значений, экранировать любые одиночные кавычки введено пользователем, и вызовите функцию доступа CDate для колонок Даты/Времени. Таким образом, если предположить, dte пользователем введенных данных и exptime является дата \ время столбца, эти две переменные могут быть установлены следующим образом:

dte = "'" + TextBox1.Text.Replace("'", "''") + "'" 
exptime = "CDATE('" + TextBox3.Text + "')" 

и так далее и так далее ...

+0

Как вы думаете, что произойдет, если 'dest' содержит одну цитату? –

+0

Это вызовет синтаксическую ошибку в запросе. По сути, вы должны иметь значение, которое заканчивается в одиночной кавычке, и любые последующие символы будут нераспознаваться движком базы данных. – Antagony

+0

Точно моя точка! Вот почему вы должны использовать параметризованные запросы. –

1

Вы должны изменить свой запрос на использование заполнителей вопросительных знаков, а затем добавить параметры для предотвращения (среди прочего) sql injection вопросов.

Кроме того, необходимо добавить квадратные скобки в именах столбцов, если у них есть пробелы в них:

sqlString = "INSERT INTO [DETAILED GISTEC CARS] ([Record No], [Date], [Car], [Taken By], [Destination], [Client], [Expected Time to Return]) VALUES (?, ?, ?, ?, ?, ?, ?);" 

Dim cmd = New OleDbCommand(sqlString, myConn) 
cmd.Parameters.Add(New OleDbParameter("Record No", recordno)) 
cmd.Parameters.Add(New OleDbParameter("Date", dte)) 
'etc 
'etc 
cmd.ExecuteNonQuery() 

См this page about OleDbParameters для получения дополнительной информации.

Смежные вопросы