OleDbException未处理… UPDATE语句中的语法错误

我得到那个错误,当我debugging请有人可以帮助请…下面是代码:

Private Sub UpdateToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UpdateToolStripMenuItem.Click If MsgBox("Save Changes?", MsgBoxStyle.Question + MsgBoxStyle.YesNo, "WARNING") = MsgBoxResult.Yes Then Dim oleDC As New OleDbCommand With oleDC .Connection = conn .CommandText = "UPDATE tblPatientsRecord SET Names='" & txtNames.Text & _ "',Licensenumber='" & txtLicensenumber.Text & _ "',Address='" & txtAddress.Text & _ "',Fullname='" & txtFullname.Text & _ "',Birthday='" & txtBase.Text & "',Age='" & txtAge.Text & _ "',Country='" & cmbCountry.Text & "' WHERE PatientID='" & txtPatientID.Text & "'" .ExecuteNonQuery() MsgBox("Record Updated!", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "SUCCESS") Disable() Clear() SaveToolStripMenuItem.Enabled = False NewToolStripMenuItem.Enabled = True LoadPatientsRecord() getLastPatientID() End With End If End Sub 

请帮助

你应该使用SQL参数。 这不仅会简化您的代码,而且还会减less某些types的错误,并防止SQL注入攻击:

 Dim sql = <sql> UPDATE tblPatientsRecord SET [Names] = @p1, Licensenumber = @p2, Address = @p3, Fullname = @p4, Birthday = @p5, [Age] = @p6, Country = @p7 WHERE PatientID = @p8 </sql>.Value Using conn = New OleDbConnection(myConnStr), cmd As New OleDbCommand(sql, conn) conn.Open() cmd.Parameters.Add("@p1", OleDbType.VarChar).Value = txtNames.Text cmd.Parameters.Add("@p2", OleDbType.VarChar).Value = txtLicensenumber.Text ' ...etc cmd.Parameters.Add("@p6", OleDbType.Integer).Value = intVar 'the last one is the WHERE cmd.Parameters.Add("@p8", OleDbType.VarChar).Value = Convert.ToInt32(lblPatientID.Text) cmd.ExecuteNonQuery() '... etc End Using 

还有其他一些常见的问题应该考虑。

  1. DBConnection对象旨在被创build,使用和处置,而不是与一遍又一遍地使用相同的对象。 但是,您可以使用全局连接string或创build一个函数来返回一个新的连接,以便您不具有相同的连接string。 看到这个答案为后者的一个例子。

  2. 许多DBObjects应该被丢弃Using块将closures并处理连接和命令对象。 一般情况下,如果有Dispose方法,将它们包装在Using块中。 上面显示了如何将2个对象( OleDbConnectionOleDbCommand )“堆栈”成一个Using语句。

  3. 使用Add方法而不是AddWithValue 。 这使您可以为每个参数指定datataype,并在代码提供数字或date列的文本值时防止Datatype mismatch错误。

  4. WHERE子句只是另一个参数 。 通常,人们将使用SQL的第一部分的参数,但不必要地连接WHERE子句。

  5. 上面也使用XML文字来构造SQL。 这对于长时间复杂的SQL来说非常方便,因为您可以根据自己的喜好进行格式化和缩进。 您也可以使用多行来使其可读:

    Dim sql = "UPDATE tblPatientsRecord SET [Names] = @p1, " _ & "Licensenumber = @p2, " _ & "Address = @p3, "

  6. 如果您在表名或列名中使用SQL保留字或空格,则必须使用[Square Brackets]如图所示转义名称 。 最好不要在名称中使用。 UserPassword NamesValues是用作列名或表名的常见词,这些名称会导致SQL语法错误。

  7. Ticks不是通用的SQL字段分隔符,它们实际上表示要传递的值是string/文本: & "Age ='" & txtAge.Text & "'" 。 如果数据库设置为将Age存储为数字,那么您的SQL将以文本/string的forms传递,这可能会导致data type mismatch 。 如果是date字段, PatientIDBirthday也是如此。

    连接SQL语句的string的一个常见问题是结果中的tick( ' )太多或太less。 这不能发生在SQL参数。

SQL参数的主要目的虽然是防止错误,如果名称是“O'Brian”或“O'Reilly”或“Bobby”; DROP TABLE tblPatientsRecord“

这些原则适用于其他数据库提供程序,如MySqlSQLiteSQLServer 。 然而,确切的转义字符等细节会有所不同。

请注意,Access / OleDB实际上并不使用命名参数( @FirstName或者甚至@p2 ),所以通常会以“?”的forms看到参数。 这意味着您必须按照这些列出现在SQL中的顺序 Add参数值( Add / AddWithValue )。

有关更多信息,请参阅

  • 使用声明
  • 连接池