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

use*_*362 3 vb.net

当我调试时,我得到那个错误请有人帮忙请...以下是代码:

 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)

请帮忙

Ňɏs*_*arp 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
Run Code Online (Sandbox Code Playgroud)

还有其他几个常见的问题应该倾向于.

  1. DBConnection对象旨在创建,使用和处置,而不是一遍又一遍地使用的对象.但是,您可以使用全局连接字符串,因此您不能在整个位置使用相同的连接字符串.

  2. 应该处理许多DBObject. Using块将关闭并处理连接和命令对象.通常,如果有某些Dispose方法,请将它们包装在一个Using块中.上面显示了如何将2个对象(OleDbConnectionOleDbCommand)"堆叠" 到一个Using减少缩进的语句中.

  3. 使用Add方法而不是AddWithValue.这允许您为每个参数指定datataype.没有它,数据库提供程序必须猜测Datatype mismatch在某些情况下哪些可能导致甚至损坏数据库.

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

  5. 上面还使用XML文字来构造SQL.这对于长而复杂的SQL很方便,因为您可以根据需要对其进行格式化和缩进.您也可以使用多行来使其可读:

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

  6. 如果在表或列名中使用SQL保留字或空格,则必须使用[Square Brackets]如图所示转义名称.最好不要在名称中使用任何一个.User,Password NamesValues通常看到用作其导致SQL语法错误列或表名字.

  7. 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,SQLiteSQLServer.但是,确切的转义字符等细节会有所不同.

请注意,Access/OleDB实际上并不使用命名参数(@FirstName或者甚至@p2),因此通常会以"?"的形式看到params.这意味着您必须以与SQL中出现的列完全相同的顺序添加参数值(Add/ AddWithValue).

有关更多信息,请参阅