2013-04-04 67 views
0

當我嘗試在這三個字段中插入數據時,在INSERT INTO語句中出現錯誤說錯誤。 但只保存在第一個字段sname它被添加,但當添加其他兩個得到這個錯誤 我得到一個異常在INSERT INTO語句檢查 以下任何建議?在INSERT INTO的vb.net代碼錯誤

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    Try 
     Dim dbprovider As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Taher\Documents\Visual Studio 2010\Projects\WindowsApplication1\WindowsApplication1\Database1.accdb;Persist Security Info=False;" 
     Me.con = New OleDb.OleDbConnection() 
     con.ConnectionString = dbprovider 
     con.Open() 

     Dim sqlquery As String = "INSERT INTO admin (sname,username,password)" + "VALUES ('" & txtname.Text & "','" & txtuser.Text & "','" & txtpass.Text & "');" 
     Dim sqlcommand As New OleDb.OleDbCommand(sqlquery) 
     With sqlcommand 
      .CommandText = sqlquery 
      .Connection = con 
      .ExecuteNonQuery() 
      con.Close() 
     End With 
     MsgBox("User Registered") 
    Catch ex As Exception 
     MsgBox(ex.ToString) 
    End Try 
End Sub 
+1

除了你的問題,你真的應該保護自己免受*** [SQL注入](http://msdn.microsoft.com/en-us/library/ff648339.aspx)*** ... – 2013-04-04 17:59:24

+0

我同意,雖然這不是嚴重的只是kickabout的東西.... – CrashOverride 2013-04-04 18:03:02

回答

6

單詞PASSWORD是JET-SQL for Microsoft Access中的保留關鍵字。如果你有一個同名的列,你應該用方括號

"INSERT INTO admin (sname,username,[password])" &% _ 
"VALUES ('" & txtname.Text & "','" & txtuser.Text & _ 
"','" & txtpass.Text & "');" 

這是語法錯誤的原因將其封裝,但讓我告訴你,構建SQL命令連接字符串是一個非常不好的做法。您將有問題,當你的價值觀包含單引號和最糟糕的是,你的代碼可以用於SQL注入攻擊

所以,你的代碼應該以這種方式來改變

Dim sqlquery As String = "INSERT INTO admin (sname,username,password)" & _ 
    "VALUES (?, ?, ?)" 
Dim sqlcommand As New OleDb.OleDbCommand(sqlquery) 
With sqlcommand 
    .CommandText = sqlquery 
    .Connection = con 
    .Parameters.AddWithValue("@p1", txtname.Text) 
    .Parameters.AddWithValue("@p2", txtuser.Text) 
    .Parameters.AddWithValue("@p3", txtpass.Text) 
    .ExecuteNonQuery() 
    con.Close() 
End With 

也是你的對象使用OleDbConnection不遵循一個好的模式。如果發生異常,請不要關閉連接,這可能會在後續調用中重新使用連接時出現問題。 你應該嘗試以這種方式使用Using statement

Using connection = New OleDb.OleDbConnection() 
    connection.ConnectionString = dbprovider 
    connection.Open() 
    ..... 
    ' rest of command code here ' 
    ' No need to close the connection 
End Using 

,如果你還得到一個異常的OleDbConnection的將被關閉,配置而不對系統資源的使用情況的影響。

+1

*請*不要在錯誤的答案發布。使用預準備的語句 – 2013-04-04 18:01:03

+0

嘿史蒂夫,這是輝煌的工作,感謝.... – CrashOverride 2013-04-04 18:01:21

+0

偉大的東西......謝謝你的 – CrashOverride 2013-04-04 18:06:34