当我调试时,我得到那个错误请有人帮忙请...以下是代码:
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
Run Code Online (Sandbox Code Playgroud)
请帮忙
您应该使用SQL参数.这些不仅会简化您的代码,还会使语法和数据类型的某些错误极不可能发生,并防止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
cmd.Parameters.Add("@p7", OleDbType.VarChar).Value = strVar
'the last one is the WHERE
cmd.Parameters.Add("@p8", OleDbType.VarChar).Value = Convert.ToInt32(lblPatientID.Text)
cmd.ExecuteNonQuery()
'... etc
End Using
Run Code Online (Sandbox Code Playgroud)
还有其他几个常见的问题应该倾向于.
DBConnection对象旨在创建,使用和处置,而不是一遍又一遍地使用的对象.但是,您可以使用全局连接字符串,因此您不能在整个位置使用相同的连接字符串.
应该处理许多DBObject. Using
块将关闭并处理连接和命令对象.通常,如果有某些Dispose
方法,请将它们包装在一个Using
块中.上面显示了如何将2个对象(OleDbConnection
和OleDbCommand
)"堆叠" 到一个Using
减少缩进的语句中.
使用Add
方法而不是AddWithValue
.这允许您为每个参数指定datataype.没有它,数据库提供程序必须猜测Datatype mismatch
在某些情况下哪些可能导致甚至损坏数据库.
该WHERE
子句只是另一个参数.通常人们会在SQL的第一部分使用Parameters,但不必要地连接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字段分隔符,它们实际上表明传递的值是字符串/文本:& "Age ='" & txtAge.Text & "'"
.如果将DB设置为存储Age
为数字,则SQL将其作为text/string传递,这可能会导致a data type mismatch
.如果是日期字段PatientID
,Birthday
则也是如此.
连接SQL语句的字符串的常见问题是'
结果中的ticks()太多或太少.这种情况不会发生在SQL参数中.
SQL参数的主要目的是防止出现错误,如果名称是"O'Brian"或"O'Reilly"或"Bobby"; DROP TABLE tblPatientsRecord"
这些原则适用于其他数据库提供商,如MySql
,SQLite
和SQLServer
.但是,确切的转义字符等细节会有所不同.
请注意,Access/OleDB实际上并不使用命名参数(@FirstName
或者甚至@p2
),因此通常会以"?"的形式看到params.这意味着您必须以与SQL中出现的列完全相同的顺序添加参数值(Add
/ AddWithValue
).
有关更多信息,请参阅