为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

牛魔王的故事 2019-07-22 10:10:07
OleDbException未处理…UPDATE语句中的语法错误我调试时会出错,请有人帮忙.以下是代码: 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 IfEnd Sub请帮帮忙
查看完整描述

1 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

您应该使用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()
    '... etcEnd Using

还有其他几个常见的问题,应该加以处理。

  1. DBConnection对象用于创建、使用和处理而不是一次又一次的重复使用。但是,你能,会,可以使用全局连接字符串,这样就不会到处都有相同的连接字符串。

  2. 许多应该处理dbObjects。Using块将关闭并释放连接和命令对象。一般情况下,如果某物Dispose方法,将它们包装在Using封锁。上面展示了如何“堆栈”2个对象(OleDbConnectionOleDbCommand)合而为一Using语句减少缩进。

  3. 使用Add方法而不是AddWithValue..这允许您为每个参数指定datataype。没有它,DB提供程序必须猜测会导致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. 蜱不是通用的sql字段分隔符,它们实际上表明传递的值是字符串/文本:& "Age ='" & txtAge.Text & "'"..如果DB被设置为存储Age作为一个数字,您的SQL将它作为文本/字符串传递,这会导致data type mismatch..同样的道理也适用于PatientIDBirthday如果是日期字段。

    SQL语句串连字符串的一个常见问题是太多或太少的滴答声(')在结果中。这在SQL参数中是不可能发生的。

但是,SQL参数的主要用途是防止名称为“O‘Brian”或“O’Reilly”或“鲍比”;“放下桌子”(TblPatientsRecord)

这些原则适用于其他DB提供程序,例如MySqlSQLiteSQLServer..然而,细节(如确切的转义字符)将有所不同。

请注意,Access/OleDB实际上并不是使用这样命名的参数(@FirstName甚至@p2),所以经常会看到以“?”的形式出现的平行线。这意味着必须添加参数值(Add/AddWithValue以同样的顺序当这些列出现在SQL中时。

有关更多信息,请参见:


查看完整回答
反对 回复 2019-07-22
  • 1 回答
  • 0 关注
  • 417 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信