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

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

请帮帮忙


牛魔王的故事
浏览 418回答 1
1回答

临摹微笑

您应该使用SQL参数。这些不仅会简化您的代码,还会在语法和数据类型方面造成某些类型的错误。极不可能并防止SQL注入攻击:Dim&nbsp;sql&nbsp;=&nbsp;<sql>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UPDATE&nbsp;tblPatientsRecord&nbsp;SET&nbsp;[Names]&nbsp;=&nbsp;@p1, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Licensenumber&nbsp;=&nbsp;@p2,&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Address&nbsp;=&nbsp;@p3, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fullname&nbsp;=&nbsp;@p4, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Birthday&nbsp;=&nbsp;@p5,&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[Age]&nbsp;=&nbsp;@p6, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Country&nbsp;=&nbsp;@p7 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE&nbsp;PatientID&nbsp;=&nbsp;@p8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</sql>.Value Using&nbsp;conn&nbsp;=&nbsp;New&nbsp;OleDbConnection(myConnStr), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmd&nbsp;As&nbsp;New&nbsp;OleDbCommand(sql,&nbsp;conn) &nbsp;&nbsp;&nbsp;&nbsp;conn.Open() &nbsp;&nbsp;&nbsp;&nbsp;cmd.Parameters.Add("@p1",&nbsp;OleDbType.VarChar).Value&nbsp;=&nbsp;txtNames.Text &nbsp;&nbsp;&nbsp;&nbsp;cmd.Parameters.Add("@p2",&nbsp;OleDbType.VarChar).Value&nbsp;=&nbsp;txtLicensenumber.Text&nbsp;&nbsp;&nbsp;&nbsp;'&nbsp;...etc &nbsp;&nbsp;&nbsp;&nbsp;cmd.Parameters.Add("@p6",&nbsp;OleDbType.Integer).Value&nbsp;=&nbsp;intVar &nbsp;&nbsp;&nbsp;&nbsp;cmd.Parameters.Add("@p7",&nbsp;OleDbType.VarChar).Value&nbsp;=&nbsp;strVar&nbsp;&nbsp;&nbsp;&nbsp;'the&nbsp;last&nbsp;one&nbsp;is&nbsp;the&nbsp;WHERE &nbsp;&nbsp;&nbsp;&nbsp;cmd.Parameters.Add("@p8",&nbsp;OleDbType.VarChar).Value&nbsp;=&nbsp;Convert.ToInt32(lblPatientID.Text) &nbsp;&nbsp;&nbsp;&nbsp;cmd.ExecuteNonQuery() &nbsp;&nbsp;&nbsp;&nbsp;'...&nbsp;etcEnd&nbsp;Using还有其他几个常见的问题,应该加以处理。DBConnection对象用于创建、使用和处理而不是一次又一次的重复使用。但是,你能,会,可以使用全局连接字符串,这样就不会到处都有相同的连接字符串。许多应该处理dbObjects。.&nbsp;Using块将关闭并释放连接和命令对象。一般情况下,如果某物Dispose方法,将它们包装在Using封锁。上面展示了如何“堆栈”2个对象(OleDbConnection和OleDbCommand)合而为一Using语句减少缩进。使用Add方法而不是AddWithValue..这允许您为每个参数指定datataype。没有它,DB提供程序必须猜测会导致Datatype mismatch或者在某些情况下甚至损坏数据库。这个WHERE子句只是另一个参数。..通常,人们会为SQL的第一部分使用参数,但对于WHERE子句则使用级联。上面的内容还使用XML文本来构造SQL。这对于长而复杂的SQL非常方便,因为您可以根据自己的喜好格式化和缩进它。您还可以使用多行使其可读性:Dim sql = "UPDATE tblPatientsRecord SET [Names] = @p1, " _ &nbsp; &nbsp; &nbsp; &nbsp;& "Licensenumber = @p2, " _ &nbsp; &nbsp; &nbsp; &nbsp;& "Address = @p3, "如果你用SQL保留字或表名或列名中的空格,则必须转义这些名称。使用[Square Brackets]如图所示。最好不要在名字中使用任何一种。User,&nbsp;Password&nbsp;Names和Values是用作列或表名的常用单词,这些名称会导致SQL语法错误。蜱不是通用的sql字段分隔符,它们实际上表明传递的值是字符串/文本:& "Age ='" & txtAge.Text & "'"..如果DB被设置为存储Age作为一个数字,您的SQL将它作为文本/字符串传递,这会导致data type mismatch..同样的道理也适用于PatientID和Birthday如果是日期字段。SQL语句串连字符串的一个常见问题是太多或太少的滴答声(')在结果中。这在SQL参数中是不可能发生的。但是,SQL参数的主要用途是防止名称为“O‘Brian”或“O’Reilly”或“鲍比”;“放下桌子”(TblPatientsRecord)这些原则适用于其他DB提供程序,例如MySql,&nbsp;SQLite和SQLServer..然而,细节(如确切的转义字符)将有所不同。请注意,Access/OleDB实际上并不是使用这样命名的参数(@FirstName甚至@p2),所以经常会看到以“?”的形式出现的平行线。这意味着必须添加参数值(Add/AddWithValue)&nbsp;以同样的顺序当这些列出现在SQL中时。有关更多信息,请参见:使用语句连接池
打开App,查看更多内容
随时随地看视频慕课网APP