链接到断开连接的 ADODB.Recordset 的访问表单:保存更改

2023-12-23

我正在尝试设置一个表单以使用断开连接的 ADODB.Recordset 作为其源。
我遇到的问题是变化是not关闭表单并对提示回答“是”后,将其保存到原始 Access 表中。我缺少什么?

注意:请不要告诉我该方法没有用,它只是一个具有本地表的 POC,我计划稍后尝试使用更“远”的记录集。

Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset

Private Sub Form_Load()
    Set conn = New ADODB.Connection
    conn.Open CurrentProject.Connection

    Set rs = New ADODB.Recordset
    With rs
        rs.CursorLocation = adUseClient
        rs.Open "select * from amsPor", conn, adOpenStatic, adLockBatchOptimistic
        Set rs.ActiveConnection = Nothing
    End With
    Set Me.Recordset = rs
    conn.Close
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Select Case MsgBox("Save changes ?", vbQuestion + vbYesNoCancel)
    Case vbNo
        'do nothing
    Case vbYes
        conn.Open CurrentProject.Connection
        rs.ActiveConnection = conn
        rs.UpdateBatch
        rs.Close
        conn.Close
        Set conn = Nothing
    Case vbCancel
        Cancel = True
    End Select
End Sub

重现步骤:

  • 取一个有主键的小表
  • 用它生成自动表单
  • 保存表格。
  • 将以上代码添加到表单中,替换其中的表名select条款。
  • 清空Record Source表单的属性。
  • 保存并关闭表单。
  • 您可以打开表单并更改数据。关闭后,系统将提示您保存更改。

EDIT: 我想知道问题是否出在CurrentProject.Connection ?
在调试窗口中,我输入? CurrentProject.Connection并得到以下结果:

Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;Data Source=\\xxxxxx\yyyy$\Documents\AMS.accdb;Mode=Share Deny None;Extended Properties="";Jet OLEDB:System database=C:\Users\G828992\AppData\Roaming\Microsoft\Access\System.mdw;Jet OLEDB:Registry Path=Software\Microsoft\Office\14.0\Access\Access Connectivity Engine;Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=6;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;Jet OLEDB:Support Complex Data=True;Jet OLEDB:Bypass UserInfo Validation=False

我来这里寻找与你相同的答案,经过大量的谷歌搜索和反复试验,我终于能够完全执行你想要做的事情。我知道这是一篇旧帖子,但我没有看到任何实际提供的答案可以让您尝试做的工作。我将使用您的示例并尝试应用我必须更改和添加的内容以使其正常工作。

Dim rs As ADODB.Recordset
Dim conn As ADODB.Connection

Private Sub Form_Load()
    If CurrentProject.Connection.State = adStateOpen Then CurrentProject.Connection.Close

    Set conn = New ADODB.Connection
    conn.Open CurrentProject.Connection.ConnectionString

    Set rs = New ADODB.Recordset
    rs.CursorLocation = adUseClient
    rs.Open "select * from amsPor", conn, adOpenForwardOnly, adLockBatchOptimistic

    If Not rs Is Nothing Then
        If Not rs.ActiveConnection Is Nothing Then Set rs.ActiveConnection = Nothing
        If Not (rs.eof And rs.BOF) Then
            Set Me.Recordset = rs
        End If

        If conn.State = adStateOpen Then
            conn.Close
        End If
    End If

    Call AddNewRecord(Me.Recordset)
End Sub


Private Sub AddNewRecord(ByRef rs As ADODB.Recordset)
    On Error Resume Next 

    If Not rs Is Nothing Then
        If rs.Supports(adAddNew) Then
            rs.AddNew
            rs.Fields("FirstName").Value = "John"
            rs.Fields("LastName").Value = "Doe"

            If rs.Supports(adUpdate) Then rs.Update
        End If
    End If

    If Err.Number <> 0 Then
        Debug.Print "AddNewRecord Err Msg: " & Err.Description
        Err.Clear
    End If
End Sub


Private Sub Form_Unload(Cancel As Integer)
    Select Case MsgBox("Save changes ?", vbQuestion + vbYesNoCancel)
    Case vbYes
        Call UpdateDbWithRS(Me.Recordset)
    Case vbCancel
        Cancel = True
    Case Else
        ' Nothing.
    End Select
End Sub


Private Sub UpdateDbWithRS(ByRef rs As ADODB.Recordset)
    If Not rs Is Nothing Then
        If CurrentProject.Connection.State = adStateOpen Then CurrentProject.Connection.Close

        Set conn = New ADODB.Connection
        conn.Open CurrentProject.Connection.ConnectionString
        rs.ActiveConnection = conn

        If rs.Supports(adUpdateBatch) Then
            rs.UpdateBatch

            If Not conn Is Nothing Then
                If conn.State = adStateOpen Then conn.Close
                Set conn = Nothing
            End If
            If Not rs Is Nothing Then
                If rs.State = adStateOpen Then rs.Close
                Set rs = Nothing
            End If
        End If
    End If
End Sub

通过上面的代码我能够Add a Record to my 记录集并验证它没有出现在我的数据库表中。然后当我执行使用RS更新数据库 the Record我已经添加到记录集,以前,现在被推送到我的数据库表中。

我对你的代码所做的最大的改变是改变conn.Open CurrentProject.Connection to conn.Open CurrentProject.Connection.ConnectionString,在代码中添加If CurrentProject.Connection.State = adStateOpen Then CurrentProject.Connection.Close修复我收到的有关已打开连接的错误。然后我做的最后一个最大的改变就是替换你的游标类型 of adOpenStatic to adOpenForwardOnly。我不确定最后的更改是否确实需要,但我根据我在此处找到的断开连接的 RecordSet 示例使用了它微软支持网站 https://support.microsoft.com/en-us/help/184397/how-to-create-ado-disconnected-recordsets-in-vba-c-java.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

链接到断开连接的 ADODB.Recordset 的访问表单:保存更改 的相关文章

  • 报告文字颠倒?

    由于特定原因 我需要能够在报告的下半部分颠倒 倒置 显示一些值 这份报告的目的是打印并从中间折叠起来 所以我希望它遵循这种特定的格式 我找不到任何可以轻松做到这一点的东西 我考虑过但不知道如何实施的一些想法 导入 颠倒字体并将控件的字体设置
  • 如何在 MS Word 中的每个标题末尾应用宏?

    我有一个包含各种标题的文档 因此不一定是标题 1 或标题 2 而是所有类型的标题 我想做的是编写一个宏 例如 删除每个标题末尾的 2 个空格 例如 我们有 这是一个标题 在标题的最后 我会这样做 Selection Delete Unit
  • 使用 PDFMAKER 将多封电子邮件保存为 pdf

    我是 VBA 的新手 但我用 SAS 编写了一些程序 用汇编程序 大型机和 PC Word Perfect 宏 编写了一些程序 用 Java HTML 和其他东西编写了一些程序 我所做的是 当我遇到问题并且我认为我可以对其进行编程时 我会在
  • 尝试通过 Java 8 中的 JDBC-ODBC 连接到 .accdb 文件时出现 ClassNotFoundException

    我正在 Eclipse EE IDE 中的 Java 项目中工作 我必须在其中查询 accdb文件 问题是当我尝试加载驱动程序然后连接到数据库时 它给了我一个异常错误 My code try String filePath myfilepa
  • 在 VBA 中使用 getElementsByClassName

    我正在使用此代码从页面获取产品名称 页面代码是 div class product shop col sm 7 div class product name h1 Claro Glass 1 5 L Rectangular Air Tigh
  • 由于直接引用范围而不是通过中间变量而导致 Excel VBA 运行时错误 450

    当我尝试直接引用某个范围内的值时 出现运行时错误 450 但如果我使用中间变量 它就会起作用 我不明白为什么 所以我担心在将来的某个时候我会再次遇到错误而不知道为什么 我尝试过使用 With End With 块 但当我直接引用范围时它仍然
  • 标准 VBA 函数“找不到项目或库”

    因此 我必须在我的 PC 上运行别人的 Excel 应用程序 并且在标准函数 如日期 格式 十六进制 中间等 上收到 找不到项目或库 的信息 一些研究表明 如果我在这些函数前加上 VBA 前缀 如 VBA Date 中那样 它会正常工作 网
  • 我需要代码在两行之间复制并粘贴到另一张表中,并给出任何值?

    例如 我有 50 行数据 第一行有学生的名字 我需要代码将数据从 RAM 复制到 RAMESH 在这之间我有 20 行 我需要代码来复制行并将其粘贴到另一张纸中 它不应该问我名字 默认情况下 它必须采用 RAM 和 RAMESH 名称 好的
  • For...VBA 中的下一个循环超出限制

    我正在使用一个For Next循环填充数组 如下所示 ReDim array 1 to 100 1 to 100 For i 1 to 100 Next i But the i计数器似乎总是转到 101 而不是停止在 100 因此 这会在我
  • 查找并替换目录中所有 Excel 文件工作簿中的字符串

    我正在编写 VBA 代码来替换位于特定目录中的多个 Excel 文件 工作簿 中的特定字符串 我尝试在 Stack Overflow 上搜索 找到答案 但这与通过 Excel 中的宏替换文本文件中的字符串有关 相同的链接是查找并替换文件中的
  • MS Access 执行 POST Web 请求

    在我的 MS Access 应用程序中 我需要定期向我的网络服务器发送一批信息 我不需要任何花哨的东西 比如 SOAP XML RPC 或任何东西 只需一个简单的 POST 页面请求就足够了 我用谷歌搜索了一下 但找不到任何真正有用的东西
  • Confluence:使用 VBA 更新现有页面

    我尝试使用 VBA 更新 Confluence 页面 我的想法是使用REST API加载页面内容 修改内容然后上传修改后的版本 这是我的代码 Private Sub TestRESTApi Dim uname As String uname
  • MS Access - 粘贴确认事件后

    当用户将记录直接粘贴到数据表子报表中时 是否可以在显示粘贴确认消息后捕获事件 我需要它能够在审计表中创建新记录时进行记录 通过捕获更新前 更新后和插入事件 我可以轻松创建已添加的记录集合 准备将详细信息插入审核日志 但是在所有这些事件触发后
  • 我可以用文本框设置变量名称吗? excel

    我可以使用 TextBox Vba Excel 设置变量的名称吗 我必须以在文本框中写入组名称并单击命令按钮的方式输入新的产品组 代码必须从文本框中获取字符串 并将该字符串设置为新创建的数组的名称 我只想在运行时创建一个新变量 或数组 据信
  • 将ADODB二进制流转换为字符串vba

    我有以下问题 我有一个存储在服务器上的 CSV 文件 但它有 3 个字符作为分隔符 我想从 URL 加载数据并使用 作为分隔符将数据填充到 Excel 页面的列中 到目前为止 我找到了使用 ADODB 记录集从网站加载文件的代码 但我无法进
  • 将匹配的行复制到另一张纸中

    我有两张表 sheet1 和sheet 2 我正在查看工作表 1 的 T 列 如果工作表 2 中 T 包含 1 则粘贴完整行 该代码运行良好 但它将sheet2 中的结果粘贴到sheet1 的同一行中 这会导致行之间出现空白 任何人都可以建
  • 当使用公式生成超链接时,VBA 打开 Excel 超链接不起作用

    使用公式生成的 Excel 超链接似乎存在错误 我使用的是 Excel 2010 我有一个电子表格 其中的单元格包含 URL 我的目标是执行以下两件事 将这些单元格变成超链接 创建一个键盘快捷键来打开这些超链接 这样我就不必使用鼠标了 为了
  • 所以,我有 6 个“主”文件,然后分为 40 个单独的文件

    我将简要描述我想要的内容 我有 6 个 主 文件 每个文件包含 40 个工作表 如下所示 AG 工作簿有 HR Gp 1 到 HR Gp 40 ER 工作簿有 FB Gp 1 到 Gp 40 等 所有工作表都已 平坦 我已经成功创建了一个适
  • 使用宏打开受信任文档或启用宏时 Excel 崩溃

    正如标题所示 我无法使用宏打开受信任的文档 Excel 立即崩溃 制作文档的副本允许其打开 因为该副本不受信任 并且我可以检查 VB 编辑器中的宏 但启用宏会导致另一次崩溃 为什么会发生这种情况以及我可以采取什么措施来解决它 我今天遇到了类
  • Excel 2013 数据透视表不会更改当前页面,除非手动导航到

    我们有一小段 VBA 代码 多年来一直完美运行 本质上是 Me PivotTables APivot PivotFields AField CurrentPage Some text 这种方法一直有效 直到 Excel 2013 该行将失败

随机推荐

  • .NET 的 StringBuilder 是线程安全的吗

    MSDN 文档的常规 线程安全 部分StringBuilder指出 不保证任何实例成员都是线程安全的 但这个语句感觉就像是为框架中的几乎每个类复制并粘贴了 http msdn microsoft com en us library syst
  • CombinedDomainXYPlot 不重新缩放域轴

    当我从使用 CombinedDomainXYPlot 的图表中隐藏系列数时 所有范围轴都会很好地自动重新缩放 但是 域轴不会重新缩放 有没有办法手动刷新缩放 或者我可能缺少一个设置来启用此设置中域轴的自动缩放 CombinedDomainX
  • JAX-RS和自定义授权

    我正在尝试保护 JAX RS 端点 目前正在尝试弄清楚身份验证和授权是如何工作的 大多数示例都非常简单 因为它们仅通过 web xml 搭载 Java EE 应用服务器角色 我想知道如何使用 Java EE AS 角色之外的其他角色 例如
  • Couchbase Lite 2 + JsonConvert

    以下代码示例将一个简单的对象写入 couchbase lite 版本 2 数据库 然后读取所有对象 这个你可以在官方文档中找到here https developer couchbase com documentation mobile 2
  • 在 Chrome 扩展中运行喊播广播

    我想为我的网络shoutcast网络广播电台创建一个chrome扩展 我设法使这一切正常工作 除了每当我点击弹出窗口时 它就会关闭 并且流也会随之停止 读了一点之后 我发现我需要创建一个后台页面 这将使播放器在后台运行 这就是我迷失和困惑的
  • 如何强制浏览器不存储 HTML 表单字段数据?

    在 HTML 表单中输入内容时 Firefox 或 Internet Explorer 等浏览器会存储这些值 有时会悄悄存储 因此 当输入另一个网络表单时 浏览器会智能地建议相同的信息 显示下拉列表的另一种方法是双击空文本框 在电子商务网站
  • Python读取设备管理器信息

    我只需要使用 python 2 7 脚本读取设备管理器中列出的所有信息 特别是 IDE ATA ATAPI 控制器 子类别下的信息 需要检测 SATA 驱动器是否处于 AHCI 或 IDE 模式 一种简单的方法 在 Windows 上 是使
  • multer、multiparty 和 connect-multiparty + Nodejs 之间的区别

    我是 Node 世界的新手 用例 有一个在 Angular 前端上传 XLS 文件的简单场景 在 Node 上处理它们 进行一些操作 然后将 JSON 保存到 蒙戈数据库 从 Angular 收到文件后 我正在搜索在 Node 上解析 处理
  • ARKit Stereo – 是否可以同时运行两个 ARSCNView?

    我正在考虑对现有的 AR 应用程序进行一些修改 我想拆分视图并添加内部 2ARSCNView这样用户就可以使用VR卡盒并获得不同的体验 但Xcode总是返回给我 Session 0x102617d10 did fail with error
  • 如何在 UITextView 中显示可点击的链接

    我正在尝试在 UITextview 中显示带有可单击链接的属性字符串 我创建了一个简单的测试项目来看看哪里出了问题 但仍然无法弄清楚 我尝试启用用户交互并设置 shouldInteractWithURLs 委托方法 但它仍然不起作用 这是我
  • 为什么 CoreNLP ner tagger 和 ner tagger 将分开的数字连接在一起?

    这是代码片段 In 390 t Out 390 my phone number is 1111 1111 1111 In 391 ner tagger tag t Out 391 my O phone O number O is O 111
  • 反转数组顺序

    我正在尝试反转 java 中数组的顺序 在 O n 内使用最少的内存来完成此操作的最有效方法是什么 不需要用代码回答 伪代码就可以了 这是我的思考过程 create a new temp array I think this is a wa
  • jquery 与更新面板

    我在使用 jquery 上下文菜单和更新面板时遇到问题 我正在使用 htmlTextWriter 在 Customtextbox 控件的 RenderBeginTag 中编写上下文菜单的 javascript 一切正常 我可以右键单击每个文
  • 在 TRichEdit 中加载包含表格但没有表格边框的 RTF 文件

    我有一个 RTF 文件 正在将其加载到 TRichEdit 控件中 我面临的唯一问题是 RTF 文件中有表格 加载相同的文件会显示表格边框 但是当我在 MS Word 中加载相同的 RTF 时 它不显示任何边框 客户端想要相同的行为 有没有
  • raster可以创建不同模式的多层对象吗?

    Can a raster对象 R 中 具有不同模式 数据类型 的层 从表面上看 我们似乎总是被迫选择一种类型 library raster create a SpatialPixelsDataFrame with trivially two
  • 如何在Matlab中删除wav文件的标题

    我需要删除波形文件的前 1024 个字节 我尝试这样做 但我得到了损坏 扭曲的 wavfile wavFile fopen fullFileName r Open file for reading fseek wavFile 1024 1
  • Python 创建带有反馈的迭代器/生成器

    是否可以创建一个迭代器 生成器 它将根据某些值决定下一个值result在上一次迭代中 i e y None for x in some iterator ll y y some calculation on x 我想要选择下一个的逻辑x依赖
  • C# 构造函数线程安全吗?

    假设我有多个线程 每个线程都试图创建同一类的对象 不同线程同时创建同类型的对象会不会互相干扰 我需要在构造函数中使用 锁 吗 这在很大程度上取决于构造函数的实现 如果构造函数仅访问该类的成员 而不访问任何外部静态类或方法 那么是的 它是线程
  • Android BLE BluetoothGatt.writeDescriptor() 有时返回 false

    我正在尝试编写 BLE Android 应用程序 我发现有时当我打电话时BluetoothGatt writeDescriptor https developer android com reference android bluetoot
  • 链接到断开连接的 ADODB.Recordset 的访问表单:保存更改

    我正在尝试设置一个表单以使用断开连接的 ADODB Recordset 作为其源 我遇到的问题是变化是not关闭表单并对提示回答 是 后 将其保存到原始 Access 表中 我缺少什么 注意 请不要告诉我该方法没有用 它只是一个具有本地表的