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

时间:2015-03-21 18:19:41

标签: 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

请帮助

1 个答案:

答案 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

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

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

  2. 许多 DBObjects应该被处理Using块将关闭并处理连接和命令对象。通常,如果某些内容具有Dispose方法,请将它们包装在Using块中。以上显示了如何&#34; stack&#34; 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 reserved words或空格,则必须使用[Square Brackets]转义名称,如图所示。最好不要在名称中使用任何一个。 UserPassword NamesValues是常见的用作列名或表名的字,会导致SQL语法错误。

  7. Ticks不是通用的SQL字段分隔符,它们实际上表明传递的值是字符串/文本:& "Age ='" & txtAge.Text & "'"。如果将DB设置为存储Age作为数字,则SQL将其作为text / string传递,这可能会导致data type mismatchPatientIDBirthday如果是日期字段也是如此。

    连接SQL语句的字符串的常见问题是结果中的标记太多或太少(')。这种情况不会发生在SQL参数中。

  8. SQL参数的主要目的是防止错误,如果名称是&#34; O&#39; Brian&#34;或者&#34; O&#39; Reilly&#34;或"Bobby';DROP TABLE tblPatientsRecord"

    这些原则适用于其他数据库提供商,例如MySqlSQLiteSQLServer。但是,确切的转义字符等细节会有所不同。

    请注意,Access / OleDB实际上并没有使用命名参数(@FirstName甚至@p2),所以通常会看到params形式的&#34;&#34 ;.这意味着您必须以与SQL中出现的列相同的顺序添加参数值(Add / AddWithValue

    有关详细信息,请参阅: