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
还有其他一些常见的问题应该考虑。
-
DBConnection对象旨在被创build,使用和处置,而不是与一遍又一遍地使用相同的对象。 但是,您可以使用全局连接string或创build一个函数来返回一个新的连接,以便您不具有相同的连接string。 看到这个答案为后者的一个例子。
-
许多DBObjects应该被丢弃 。
Using
块将closures并处理连接和命令对象。 一般情况下,如果有Dispose
方法,将它们包装在Using
块中。 上面显示了如何将2个对象(OleDbConnection
和OleDbCommand
)“堆栈”成一个Using
语句。 -
使用
Add
方法而不是AddWithValue
。 这使您可以为每个参数指定datataype,并在代码提供数字或date列的文本值时防止Datatype mismatch
错误。 -
WHERE
子句只是另一个参数 。 通常,人们将使用SQL的第一部分的参数,但不必要地连接WHERE子句。 -
上面也使用XML文字来构造SQL。 这对于长时间复杂的SQL来说非常方便,因为您可以根据自己的喜好进行格式化和缩进。 您也可以使用多行来使其可读:
Dim sql = "UPDATE tblPatientsRecord SET [Names] = @p1, " _ & "Licensenumber = @p2, " _ & "Address = @p3, "
-
如果您在表名或列名中使用SQL保留字或空格,则必须使用
[Square Brackets]
如图所示转义名称 。 最好不要在名称中使用。User
,Password
Names
和Values
是用作列名或表名的常见词,这些名称会导致SQL语法错误。 -
Ticks不是通用的SQL字段分隔符,它们实际上表示要传递的值是string/文本:
& "Age ='" & txtAge.Text & "'"
。 如果数据库设置为将Age
存储为数字,那么您的SQL将以文本/string的forms传递,这可能会导致data type mismatch
。 如果是date字段,PatientID
和Birthday
也是如此。连接SQL语句的string的一个常见问题是结果中的tick(
'
)太多或太less。 这不能发生在SQL参数。
SQL参数的主要目的虽然是防止错误,如果名称是“O'Brian”或“O'Reilly”或“Bobby”; DROP TABLE tblPatientsRecord“
这些原则适用于其他数据库提供程序,如MySql
, SQLite
和SQLServer
。 然而,确切的转义字符等细节会有所不同。
请注意,Access / OleDB实际上并不使用命名参数( @FirstName
或者甚至@p2
),所以通常会以“?”的forms看到参数。 这意味着您必须按照这些列出现在SQL中的顺序 Add
参数值( Add
/ AddWithValue
)。
有关更多信息,请参阅
- 使用声明
- 连接池