尝试更新access数据库-VB.Net时UPDATE语句失败

尝试更新access数据库-VB.Net时UPDATE语句失败,vb.net,ms-access,Vb.net,Ms Access,我正在尝试为自己创建一个简单的票务软件,它有一个VB.Net前端和一个Access2003后端。我不同意允许添加新行,但当我尝试对更新行按钮进行编码时,它给了我一个错误,即Microsoft JET Database Engine-Update语句中的语法错误。我找不到问题所在 Private Sub btnUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUpdate.Clic

我正在尝试为自己创建一个简单的票务软件,它有一个VB.Net前端和一个
Access2003
后端。我不同意允许添加新行,但当我尝试对更新行
按钮进行编码时,它给了我一个错误,即
Microsoft JET Database Engine-Update语句中的语法错误。
我找不到问题所在

Private Sub btnUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUpdate.Click
    Dim da As New OleDbDataAdapter
    Dim dt As New DataTable
    Dim ConnectString As String = ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Documents and Settings\aaron-pister\Desktop\New Role Notes\Issue Tracker Express\Issue Tracker Express\Issue Tracker.mdb")
    Dim con As New OleDbConnection(ConnectString)
    con.Open()
    Dim Green42 As String = "UPDATE Issues Basic Details SET [Company Name] = '" & txtClientName.Text & "', [Status] = '" & cbStatus.Text & "', [Company Contact] = '" & txtClientContact.Text & "', [Description] = '" & txtDesc.Text & "', [Notes] = '" & txtRes.Text & "' WHERE [TicketNum] = '" & txtTicket.Text & "'"
    'con.Open()
    If txtClientName.Text <> "" Then
        Try
            'MyCom.CommandText = "UPDATE [Issues Basic Details] SET Company Name = '" & txtClientName.Text & "', Status = '" & cbStatus.Text & "', Company Contact = '" & txtClientContact.Text & "', Description = '" & txtDesc.Text & "', Notes = '" & txtRes.Text & "' WHERE TicketNum = '" & txtTicket.Text & "')"
            da = New OleDbDataAdapter(Green42.ToString, ConnectString)
            da.Fill(dt)
            da.Update(EsInfo1, "Issues Basic Details")
            MsgBox("Your record has been updated successfully.", MsgBoxStyle.DefaultButton1, "New Ticket Submitted")
        Catch ex As Exception
            MsgBox(ex.Source & "-" & ex.Message)
            con.Close()
            Exit Sub
        End Try
    Else
        MsgBox("You must have an entry in the Client Name, Client Contact and Status fields. It is recommended to also have a value in the Description field.", MsgBoxStyle.OkOnly, "Issue Tracker Express")
        btnNewIncident_Click(sender, e)
        Exit Sub
    End If
End Sub
Private Sub btnUpdate_Click(ByVal sender作为System.Object,ByVal e作为System.EventArgs)处理btnUpdate。单击
Dim da作为新的OLEDB数据适配器
Dim dt作为新数据表
Dim ConnectString作为字符串=(“提供程序=Microsoft.Jet.OLEDB.4.0;数据源=C:\Documents and Settings\aaron pister\Desktop\New Role Notes\Issue Tracker Express\Issue Tracker Express\Issue Tracker.mdb”)
Dim con作为新的OLEDB连接(连接字符串)
con.Open()
Dim Green42为String=“UPDATE Issues Basic Details SET[Company Name]=”&txtClientName.Text&“,[Status]=”&cbStatus.Text&“,[Company Contact]=”&txtClientContact.Text&“,[Description]=”&txtDesc.Text&“,[Notes]=”&txtRes.Text&“WHERE[TicketNum]=”&txtTicket.Text&“”
'con.Open()
如果txtClientName.Text为“”,则
尝试
'MyCom.CommandText=“更新[Issues Basic Details]设置公司名称='”&txtClientName.Text&',状态='&cbStatus.Text&',公司联系人='”&txtClientContact.Text&',Description='”&txtDesc.Text&',Notes='”&txtRes.Text&“&WHERE TicketNum=”&txtcticket.Text&'))
da=新的OleDbDataAdapter(Green42.ToString,ConnectString)
da.填充(dt)
da.更新(EsInfo1,“发布基本细节”)
MsgBox(“您的记录已成功更新。”,MsgBoxStyle.DefaultButton1,“已提交新票证”)
特例
MsgBox(例如来源和消息)
con.Close()
出口接头
结束尝试
其他的
MsgBox(“您必须在“客户名称”、“客户联系人”和“状态”字段中有一个条目。建议在“描述”字段中也有一个值。”,MsgBoxStyle.OkOnly,“Issue Tracker Express”)
Btnewincident_点击(发送者,e)
出口接头
如果结束
端接头

您的表名也必须用括号括起来:

Dim Green42 As String = "UPDATE [Issues Basic Details] SET [Company Name]..."

另外,不要将值放入字符串中。它避免了SQL注入。

您的表名也必须用括号括起来:

Dim Green42 As String = "UPDATE [Issues Basic Details] SET [Company Name]..."
另外,不要将值放入字符串中。它避免了SQL注入。

这:

UPDATE Issues Basic Details SET ...
不是有效的SQL。您需要通过限定表名来帮助它:

UPDATE [Issues Basic Details] SET ...
其他一些建议:

  • 使用准备好的语句(参数化SQL以避免SQL注入攻击)
  • 不要在点击事件处理程序中定义这种类型的行为——使用一个助手类来完成这项工作,这样它就可以被重用,而不会直接耦合到UI
  • 使用
    语句。您的
    OleDbConnection
    类实现了
    IDisposable
    。您没有正确处理此连接
  • 这:

    不是有效的SQL。您需要通过限定表名来帮助它:

    UPDATE [Issues Basic Details] SET ...
    
    其他一些建议:

  • 使用准备好的语句(参数化SQL以避免SQL注入攻击)
  • 不要在点击事件处理程序中定义这种类型的行为——使用一个助手类来完成这项工作,这样它就可以被重用,而不会直接耦合到UI
  • 使用
    语句。您的
    OleDbConnection
    类实现了
    IDisposable
    。您没有正确处理此连接

  • 虽然目前很难阅读代码,但看起来您确实在尝试执行“临时”查询,这可能会导致很多问题


    我建议首先将您的语句更改为a,以帮助诊断问题。

    虽然目前很难读取代码,但看起来您确实在尝试执行“临时”查询,这可能会导致很多问题


    我建议首先将您的语句更改为a,以帮助诊断问题。

    仅添加到此答案,作为一般经验规则空格,命名表和列时应避免使用特殊字符和保留关键字。仅添加到此答案,作为一般经验规则空格,命名表和列时要避免使用特殊字符和保留关键字。我不确定我是否理解您所说的参数化SQL是什么意思。我想我理解你的另外两点,也理解它们。您能提供一些示例,说明我如何在提供的代码中参数化SQL吗?@AaronPister:请参见此处的示例:。它显示了
    Using
    语句的用法和SQL语句的参数化。我不确定我是否理解您所说的参数化SQL是什么意思。我想我理解你的另外两点,也理解它们。您能提供一些示例,说明我如何在提供的代码中参数化SQL吗?@AaronPister:请参见此处的示例:。它显示了
    Using
    语句的用法和SQL语句的参数化。