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 
4

3 に答える 3

1

疑問符のプレースホルダーを使用するようにクエリを変更し、パラメーターを追加して (特に) SQL インジェクションの問題を防ぐ必要があります。

また、列名にスペースが含まれている場合は、列名に角かっこを追加する必要があります。

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()

詳細については、OleDbParameters に関するこのページを参照してください。

于 2012-06-27T12:35:44.673 に答える
0

動作するまで、Accessで直接クエリを実行してみてください。

ここからは次のようになります

  • VALUESの周りにスペースがありません
  • テーブル名にはスペースが含まれているため、テーブル名を囲むには[]を使用することをお勧めします
  • 一部の列名と同じです。
  • vbの?recordno構文がわからないため、+演算子を使用することをお勧めします

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 + ");"

于 2012-06-27T09:00:22.393 に答える
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)

また、数値以外の値を一重引用符で囲み、ユーザーが入力した一重引用符をエスケープし、日付/時刻列に対して Access CDATE 関数を呼び出す必要があります。したがって、dteユーザーが入力しexptimeたデータが Date\Time 列であると仮定すると、これら 2 つの変数は次のように設定できます。

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

などなど…

于 2012-06-27T12:17:36.823 に答える