2017-06-21 56 views
0

我试图插入上使用Visual Basic与OleDbCommand一个访问数据库中的数据插入数据库中的数据,但它一直回到我这个错误:我试着用VB

Error

这里是我的代码:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    myconnection.ConnectionString = connString 

    Dim sql As String 
    myconnection.Open() 
    sql = "INSERT INTO Atletas (Nome, Contacto, Email, dataNascimento, Morada, idEscalao) VALUES(" & Text_Nome.Text & "','" & Text_Contacto.Text & "','" & Text_Email.Text & "','" & Data_Picker.Text & "','" & Text_Morada.Text & "','" & Combo_Escalao.Tag & ")" 

    Dim cmd As OleDbCommand = New OleDbCommand(sql, myconnection) 
    cmd.ExecuteNonQuery() 
    myconnection.Close() 
End Sub 
+6

**不要** concat字符串来制作SQL。 [使用SQL参数](https://stackoverflow.com/q/29186317/1070452)。并输入错误信息到你的文章,不要张贴链接到错误信息的图片。 – Plutonix

回答

2

首先,我建议你在使用参数认真看。正如你所看到的,如果你使用了参数,你就不会有语法错误。正如史蒂夫指出的那样,它还可以消除像O'Hara或O'Kelly这样的名字出现的问题。

其次它还可以保护你免受SQL注入攻击 - 见Bobby Tables

最后,实施使用块是很好的做法,当涉及到使用的数据库连接,以防万一你忘记关闭连接时,它会在使用块结束进行处理。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 

    Using con As New OleDb.OleDbConnection 

     con.ConnectionString = "Provider = Microsoft.ACE.OLEDB.12.0;" & _ 
          "Data Source = database path here" 
     con.Open() 

     Dim sql As String = "INSERT INTO Atletas (Nome, Contacto, Email, dataNascimento, Morada, idEscalao) VALUES (@nome, @contacto, @email, @datanascimento, @morada, @idescalao);" 

     Dim sql_insert As New OleDbCommand 

     With sql_insert 
      .Parameters.AddWithValue("@nome", Text_Nome.Text) 
      .Parameters.AddWithValue("@contacto", Text_Contacto.Text) 
      .Parameters.AddWithValue("@email", Text_Email.Text) 
      .Parameters.AddWithValue("@datanascimento", Data_Picker.Value.ToString("yyyy/MM/dd")) '''Assuming the value needed is a date only 
      .Parameters.AddWithValue("@morada", Text_Morada.Text) 
      .Parameters.AddWithValue("@idescalao", Cstr(Combo_Escalao.Tag)) 
      .CommandText = sql 
      .Connection = con 
      .ExecuteNonQuery()   
     End With 

     con.close() 

    End Using 

End Sub 
+0

非常感谢。你的回答帮了我很多。 –

+0

我很高兴能帮上忙。祝你好运! –

0

您错过了两个撇号,一个在开头,另一个在结尾。以分号结尾也是一种好的做法。试试这个:

sql = "INSERT INTO Atletas (Nome, Contacto, Email, dataNascimento, Morada, idEscalao) VALUES('" & Text_Nome.Text & "','" & Text_Contacto.Text & "','" & Text_Email.Text & "','" & Data_Picker.Text & "','" & Text_Morada.Text & "','" & Combo_Escalao.Tag & "');" 

然而,随着Plutonix在他的评论中建议:请勿Concat的字符串,使SQL。 Use SQL parameters

+6

现在如果你有一个像奥哈拉这样的名字,你的答案会发生什么?请不要限制自己指出显而易见的问题,但至少应提出最佳做法。 – Steve

+0

@Steve Plutonix已经表示,在我发布我的答案之前,他在评论中提到了他,并且不想重复他已经说过的话。 –

+1

如果你重复这个问题会出现什么问题?我只会看到你的答案没有任何改进。我没有降低你的答案,但真正的好习惯的简单回顾会为OP提供正确的途径,并将保持低调。 – Steve