MS ACCESS - 需要阅读和更新

Posted

技术标签:

【中文标题】MS ACCESS - 需要阅读和更新【英文标题】:MS ACCESS -Need to read and update 【发布时间】:2015-05-21 01:54:31 【问题描述】:

错误:不支持不返回任何键列信息的 SelectCommand 为 UpdateCommand 生成动态 SQL

我正在尝试解决以下问题 - 让我的应用程序写回我的数据库。该应用程序遇到了上面列出的异常标题。我一直在这里阅读有关数据库 CRUD 操作的信息-http://www.homeandlearn.co.uk/NET/nets12p7.html

我从其他阅读中知道我需要一个主键。当您使用数据集和数据适配器时,有人可以解释这之间的关系吗?此错误与我的实际数据库或内存数据集有关吗? 我还意识到我已经基于一个查询创建了一个数据集。当我遇到未找到工单的情况时,是否需要其他查询 (INSERT)?

Private Sub BtnQuery_Click(sender As Object, e As EventArgs) Handles BtnQuery.Click

    sql = "SELECT [Ticket ID] AS Ticket_ID , [Foundstone] AS Foundstone, [ID] AS ID FROM [Table MAIN] WHERE ([Ticket Days OverDue] >= 0)" 'define the query
    da = New OleDb.OleDbDataAdapter(sql, con)
    da.Fill(ds, "MAIN")
    If ds.Tables("MAIN").Rows.Count > 0 Then
        TxtRows.Text = ds.Tables("MAIN").Rows.Count
        maxrows = Val(TxtRows.Text.ToString)
    End If
    For i = 0 To maxrows - 1
        If i >= 0 Then
            result = ds.Tables("MAIN").Rows(i).Item("Ticket_ID")
            WebBrowser1.Navigate("https://fs-enterprise.my.private.url/remediation/ticket.exp?ticket=" & result)
            Do While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete
                Application.DoEvents()
            Loop
            WebBrowser1.AllowNavigation = True
            '<div id="MessageGood_0" class="mvm-status-message msm-msg msm-msg-img" style="background-image:url(/images/fam/cross.png);">The specified ticket does not exist, or is not currently available.</div>  
            For Each el As HtmlElement In WebBrowser1.Document.GetElementsByTagName("div")
                If (el.GetAttribute("id").Equals("MessageGood_0")) Then
                    TxtTicket.Text = ds.Tables("MAIN").Rows(i).Item("Ticket_ID")
                    'Try
                        Dim cb As New OleDb.OleDbCommandBuilder(da)
                        cb.QuotePrefix = "[" 'allows update if table name or field is a reserved word in MS Access
                        cb.QuoteSuffix = "]" 'allows update if table name or field is a reserved word in MS Access
                        ds.Tables("MAIN").Rows(i).Item("Foundstone") = "Not Found"
                        da.Update(ds, "MAIN")
                        da.UpdateCommand = cb.GetUpdateCommand()
        MsgBox("Ticket Not Found")
                    'Catch ex As Exception
                        'MsgBox(ex.Message.ToString, , "Error")
                    'End Try
                Else
                    '<input class="boldbutton" type="button" value="Verify" onclick="this.form.knob.value='ReqVerify';this.form.verify.value=1;this.form.submit()"></td>
                    TxtTicket.Text = ds.Tables("MAIN").Rows(i).Item("Ticket_ID")
                    For Each element As HtmlElement In WebBrowser1.Document.GetElementsByTagName("INPUT")
                        If (element.GetAttribute("value").Equals("Verify")) Then
                            element.InvokeMember("click")
                        End If
                    Next
                End If
            Next
        End If
    Next
    MessageBox.Show("All Tickets Have Been Processed")
    Me.Close()
    con.Close()
End Sub       

【问题讨论】:

需要在您正在访问的数据库表上设置主键(本例中为main)。您不需要单独的查询来添加新行。您可以将该行添加到内存数据集中,然后进行更新。 @theduck。谢谢,我知道主键需要在我正在访问的表中。我试图在我的脑海中澄清这个问题 - 密钥是在实际数据库还是数据集中设置(数据库的内存表示)?我不需要添加任何额外的数据行,只需写回已经存在的行中没有数据的列。 主键需要设置在实际的数据库表上,而不是内存中的表示。如果您不需要添加新行,您应该能够只更新数据集并将更改提交回数据库。 @theduck 感谢您的澄清!现在我的问题的第二部分。在我上面的代码中,我创建了一个数据集,该数据集根据票号进行迭代和处理。如果找到票证,则按下提交按钮。如果未找到票证,我正在尝试将“未找到”值写回 Foundstone 列中的数据库因此,我基于一个查询创建了数据集,但我该如何写回?这是一个单独的插入查询,它被放置在我的程序的“未找到”逻辑中吗? 【参考方案1】:

第一个问题的答案是,主键需要设置在实际的数据库表上,而不是内存中的数据集上。

在回答您的第二个问题时,您可以使用以下方法从您的数据集中更新数据库:

Dim cb As New OleDb.OleDbCommandBuilder(da)
ds.Tables("MAIN").Rows(i).Item("Foundstone") = "Not Found"
da.UpdateCommand = cb.GetUpdateCommand()
da.Update(ds, "MAIN")

【讨论】:

好的,现在我明白了!根据您提供的代码,您将插入命令传递回数据适配器。我应该能够解决其余的问题。我对数据库编程和一般编程是全新的。作为计算机专业的一部分,我只上过一节 VB 课。 (我的专业是网络而不是编程。)所以我很惊讶我做得很好。非常感谢您澄清我的问题。这使我对新技术(对我来说是新的)的学习有了一个完整的循环。 :-) 我想我说得太早了。我按照建议进行了编辑。我遇到了更多问题并修复了这些问题。现在,我没有抛出任何异常错误,但我也没有看到数据被写入源数据库。我哪里错了? 好的交换了,但仍然没有。我确实检查了我的源数据库,并且列字段类型设置为短文本。 另外,删除您的 try/catch 以便您查看任何错误。 如上图删除(假设我理解正确)仍然没有错误

以上是关于MS ACCESS - 需要阅读和更新的主要内容,如果未能解决你的问题,请参考以下文章

更新查询的 MS Access SQL 错误

使用 MS Access 如何使用多个连接和 where 子句执行更新?

MS Access 数据库需要更新版本

Grails 连接到 Ms Access

使用 c# 和 oledb 查询更新 Ms-Access 2010 中的列值

在 MS Access 数据表子表单中导航和更新