我在调试时遇到错误请有人帮忙请... 以下是代码:
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
请帮助
答案 0 :(得分:5)
您应该使用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
还有其他几个常见的问题应该倾向于。
DBConnection对象旨在创建,使用和处理,而不是一遍又一遍地使用的对象。但是,您可以使用全局连接字符串,因此您不必在整个地方拥有相同的连接字符串。
许多 DBObjects应该被处理。 Using
块将关闭并处理连接和命令对象。通常,如果某些内容具有Dispose
方法,请将它们包装在Using
块中。以上显示了如何&#34; stack&#34; 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 reserved words或空格,则必须使用[Square Brackets]
转义名称,如图所示。最好不要在名称中使用任何一个。 User
,Password
Names
和Values
是常见的用作列名或表名的字,会导致SQL语法错误。
Ticks不是通用的SQL字段分隔符,它们实际上表明传递的值是字符串/文本:& "Age ='" & txtAge.Text & "'"
。如果将DB设置为存储Age
作为数字,则SQL将其作为text / string传递,这可能会导致data type mismatch
。 PatientID
和Birthday
如果是日期字段也是如此。
连接SQL语句的字符串的常见问题是结果中的标记太多或太少('
)。这种情况不会发生在SQL参数中。
SQL参数的主要目的是防止错误,如果名称是&#34; O&#39; Brian&#34;或者&#34; O&#39; Reilly&#34;或"Bobby';DROP TABLE tblPatientsRecord"
这些原则适用于其他数据库提供商,例如MySql
,SQLite
和SQLServer
。但是,确切的转义字符等细节会有所不同。
请注意,Access / OleDB实际上并没有使用命名参数(@FirstName
甚至@p2
),所以通常会看到params形式的&#34;&#34 ;.这意味着您必须以与SQL中出现的列相同的顺序添加参数值(Add
/ AddWithValue
)。
有关详细信息,请参阅: