多线程场景中的 Microsoft.ACE.OLEDB.12.0 错误

2023-12-07

我在 x64 应用程序中使用Microsoft Access 数据库引擎 2010(Microsoft Office 2016 的一部分)用于处理 mdb 文件。 但是,当前版本的 Microsoft Access Database Engine 2010(OLEDB 提供程序 Microsoft.ACE.OLEDB.12.0)有一个错误。 该引擎在多线程工作中崩溃。 如果我在不同的线程中创建与此提供程序的两个 OLE DB(或 ADO DB)连接,那么其中一个将崩溃Mso40UIwin32client.dll异常 0xC0000005:访问冲突写入位置 0x0000000000000000。

异常堆栈:

  • ACEOLEDBTest.exe 中的 0x00007FFB32361F28 处抛出异常:Microsoft C++ 异常:内存位置处的 std::runtime_error 0x0000006B771FEAF0。
  • 在 0x00007FFB32361F28 处抛出异常 ACEOLEDBTest.exe:Microsoft C++ 异常:[重新抛出] 内存 位置 0x0000000000000000。
  • 0x00007FFB32361F28 处抛出异常 在 ACEOLEDBTest.exe 中:Microsoft C++ 异常:std::runtime_error at 内存位置 0x0000006B771FEAF0。
  • 抛出异常 ACEOLEDBTest.exe 中的 0x00007FFB32361F28:Microsoft C++ 异常: std::runtime_error 位于内存位置 0x0000006B771FEFB8。
  • 例外 抛出于 0x00007FFAF9ED1271 (Mso40UIwin32client.dll) ACEOLEDBTest.exe:0xC0000005:写入位置访问冲突 0x0000000000000000。

出现此错误的 C++ 代码示例:

#include "stdafx.h"
#include <atlcom.h>
#include <atldbcli.h>
#include <conio.h>

typedef UINT(__stdcall* fnThread)(PVOID);

HANDLE hExitEvent = NULL;

UINT __stdcall DbThread1(IN PVOID context)
{
    HRESULT hRes = ::CoInitializeEx(NULL, COINIT_MULTITHREADED);
    _ASSERTE(SUCCEEDED(hRes));

    CDataSource DataSource;         // Data source connection object

    while (::WaitForSingleObject(hExitEvent, 0) != WAIT_OBJECT_0)
    {
        // Open DB connection
        ATLTRACE2(atlTraceGeneral, 0, L"DbThread1: Create connection...\n");
        hRes = DataSource.OpenFromInitializationString(L"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=\"C:\\Temp\\Index_empty1.mdb\"; Persist Security Info=False;");
        _ASSERTE(SUCCEEDED(hRes));

        // Close DB connection
        DataSource.Close();
        ATLTRACE2(atlTraceGeneral, 0, L"DbThread1: Close connection...\n");
        Sleep(20);
    }

    ::CoUninitialize();
    _endthreadex(0);
    return 0;
}

UINT __stdcall DbThread2(IN PVOID context)
{
    HRESULT hRes = ::CoInitializeEx(NULL, COINIT_MULTITHREADED);
    _ASSERTE(SUCCEEDED(hRes));

    CDataSource DataSource;         // Data source connection object

    while (::WaitForSingleObject(hExitEvent, 0) != WAIT_OBJECT_0)
    {
        // Open DB connection
        ATLTRACE2(atlTraceGeneral, 0, L"DbThread2: Create connection...\n");
        hRes = DataSource.OpenFromInitializationString(L"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=\"C:\\Temp\\Index_empty2.mdb\"; Persist Security Info=False;");
        _ASSERTE(SUCCEEDED(hRes));

        // Close DB connection
        DataSource.Close();
        ATLTRACE2(atlTraceGeneral, 0, L"DbThread2: Close connection...\n");
        Sleep(20);
    }

    ::CoUninitialize();
    _endthreadex(0);
    return 0;
}

int main()
{
    ::CoInitializeEx(NULL, COINIT_MULTITHREADED);
    hExitEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);

    const fnThread aPtrs[] = { DbThread1, DbThread2 };
    HANDLE hDbThread[_countof(aPtrs)] = { NULL };
    for (int nIndex = 0; nIndex < _countof(aPtrs); nIndex++) {
        if ((hDbThread[nIndex] = (HANDLE)::_beginthreadex(nullptr, 0, aPtrs[nIndex], nullptr, 0, nullptr)) == NULL)
        {
            return 1;
        }
    }


    CComVariant varData;
    printf("Press any key to exit...");

    // Loop until any key struck
    while (!_kbhit())
    {
        for (DWORD i = 0; i < 100; i++)
        {
            // Test for bug of the OLEDB provider for MS ACCESS 2010.
            varData.Clear();
        }
        Sleep(0);
    }

    // Request threads to exit
    SetEvent(hExitEvent);

    // Wait for threads to exit
    WaitForMultipleObjects(_countof(hDbThread), hDbThread, TRUE, INFINITE);
    for (auto& h : hDbThread) {
        CloseHandle(h);
    }

    CloseHandle(hExitEvent);
    ::CoUninitialize();

    return 0;
}

您应该使用 Visual C++ 2013/2015 为 x64 平台构建此示例。 我在以下位置发现了类似的错误MS forum。有谁能够帮助我?


我们也在多线程 VB.Net (Framework v4.5.2) 服务应用程序中遇到了这个问题。经过多次测试,我们发现解决此问题的唯一方法是使用单个线程或关闭连接池(使用 OLE DB Services=-2)。最后我们选择了后者,因为我们需要系统能够并行处理请求。

仅供参考,我安装的 Office 2016 版本不包含此驱动程序(因此我们的程序通过了任何类型的基本测试),但它包含在我们的客户安装的 Office 2016 版本中。到目前为止,我已经检查了“Microsoft Office Professional Plus 2016”(来自 MSDN 和 MS 合作伙伴网络)和“Microsoft Office 365 ProPlus”,但它们似乎都没有附带 Microsoft.ACE.OLEDB.12.0 OLEDB 提供程序。另外,据我所知,唯一可供下载的 Microsoft Access Database Engine 2010 Redistributable 版本是 SP2(2013 年 7 月 22 日发布),因此很难在开发环境中对其进行测试!

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

多线程场景中的 Microsoft.ACE.OLEDB.12.0 错误 的相关文章

  • C# WinForms:使用一个或多个附加线程进行绘图。如何?

    如果我有一张包含各种几何形式 直线 矩形 圆形等 的大图 线程需要花费大量时间来绘制所有内容 但在现实生活中 一栋建筑是由不止一名工人建造的 因此 如果绘图是建筑物而线程是构建者 则绘制速度会快得多 但我想知道怎么做 你能告诉我怎么做吗 有
  • Python 2.7:支持一个端口上多个连接的流式 HTTP 服务器

    我正在寻找一个标准的Python 2 7包 提供一个同时执行的HTTP服务器流媒体同一端口号上的连接 嘿 各位版主 请停止将我的问题标记为想要以非流媒体方式提供服务的问题的重复项 例如 python 中的多线程 Web 服务器 https
  • 我应该选择哪个 VC++ 运行时版本 - 静态还是动态?

    我正在开发一个 64 位进程内 VC ATL COM 服务器 它基本上只是将所有调用重定向到进程外 COM 服务器 所以我的COM服务器基本上什么都不做 最初它在 DLL 中使用 C 运行时 MD编译器开关 我注意到当我在干净的 64 位
  • 从 Handler.obtainMessage() 获取什么参数

    我正在使用线程来执行一些 BT 任务 我正在尝试向 UI 线程发送消息 以便我可以基于我的 BT 线程执行 UI 工作 为此 我使用处理程序 但我不知道如何检索发送到处理程序的数据 要发送数据 我使用 handler obtainMessa
  • 这个等待通知线程语义的真正目的是什么?

    我刚刚遇到一些代码 它使用等待通知构造通过其其他成员方法与类中定义的线程进行通信 有趣的是 获取锁后 同步范围内的所有线程都会在同一锁上进行定时等待 请参见下面的代码片段 随后 在非同步作用域中 线程执行其关键函数 即 做一些有用的事情1
  • 如何使用 C# 查询远程 MS ACCESS .mdb 数据库

    我正在尝试使用 C 查询 mote MS ACCESS 数据库 mdb 文件 将文件复制到本地计算机时可以成功查询它 我只想远程放置文件 所以我的客户端程序不包含原始数据 static string m path http www xyz
  • 初始化列表在 VC10 中不起作用

    我在 VC 2010 中编写了这个程序 class class1 public class1 initializer list
  • 与 OLE 服务器或 ActiveX 控件通信

    MS Access 2010 Win 7 常规形式我没有故意放置任何 ActiveX 或 OLE 东西 甚至不确定它们是什么 但无论如何 每当我在特定形式的代码中放入某些内容时 它都会说 您作为事件属性设置输入的表达式 XXXXX 产生了以
  • 当客户端关闭连接时,Spring StreamingResponseBody 请求线程未清理

    我在控制器中有一个端点 它返回一个StreamingResponseBody 用于向客户端发送文件 其代码大致如下 RestController RequestMapping value api public class Controlle
  • 导致崩溃转储的 Java 错误的解决方法

    我开发的一个程序偶尔会由于这个错误而导致 JVM 崩溃 http bugs java com bugdatabase view bug do bug id 8029516 http bugs java com bugdatabase vie
  • 父子进程之间的通信

    我正在尝试创建一个具有一个或多个子进程的 Python 3 程序 父进程生成子进程 然后继续处理自己的业务 有时我想向特定的子进程发送一条消息 由其捕获该消息并采取行动 此外 子进程在等待消息时需要处于非锁定状态 它将运行自己的循环来维护服
  • 关于java中的生产者和消费者模式与阻塞队列方法

    我正在研究有关java中线程的生产者和消费者设计模式 最近我在java 5中进行了探索 并介绍了Java 5中BlockingQueue数据结构的介绍 现在它变得更简单了 因为BlockingQueue通过引入阻塞方法隐式地提供了这种控制p
  • 从库中捕获主线程 SynchronizationContext 或 Dispatcher

    我有一个 C 库 希望能够将工作发送 发布到 主 ui 线程 如果存在 该库可供以下人员使用 一个winforms应用程序 本机应用程序 带 UI 控制台应用程序 没有 UI 在库中 我想在初始化期间捕获一些东西 Synchronizati
  • 线程睡眠和Windows服务

    我正在开发一个 Windows 服务 该服务存在一些问题Thread Sleep 所以我想我会尝试使用计时器 因为这个问题建议 在 Windows 服务中使用 Thread Sleep https stackoverflow com que
  • 调用线程无法访问该对象,因为另一个线程拥有它

    我已经阅读了很多关于此错误的帖子 但我不明白如何在我的解决方案中解决它 我有一个进度条对话框 其中包含一些逻辑 通过按钮单击从 MainFrame 调用 void OnBtnClick object sender RoutedEventAr
  • 如何在MFC中对CListCtrl中的Item进行排序?

    我在 MFC 中制作了一个基于对话框的应用程序 我将 CListCtrl 控件放在对话框上 并将其视图样式设置为报告类型 我在此列表视图中有五列 所有列都是字符串类型 我想在此列表中实现排序 也就是说 当我单击某一列时 它应该对列表中的项目
  • 为什么我应该关心压缩 MS Access .mdb 文件?

    我们分发一个使用 MS Access mdb 文件的应用程序 有人注意到 在 MS Access 中打开文件后 文件大小缩小了很多 这表明该文件是压缩的良好候选者 但我们不为用户提供执行此操作的方法 所以 我的问题是 这重要吗 我们关心吗
  • 任务并行库周围是否有一个接口包装器,以便我可以将其交换用于单元测试?

    I asked 这个问题 https stackoverflow com questions 3362734 unit testing concurrent software what do you do不久以前 我现在知道这是一个坏主意
  • 将数据打印到文件

    我已经超载了 lt lt 运算符 使其写入文件并写入控制台 我已经为同一个函数创建了 8 个线程 并且我想输出 hello hi 如果我在无限循环中运行这个线程例程 文件中的o p是 hello hi hello hi hello hi e
  • 是否有一种更简单的方法可以并行运行命令,同时在 Windows PowerShell 中保持高效?

    此自我回答旨在为那些受困于 Windows PowerShell 并由于公司政策等原因而无法安装模块的用户提供一种简单且高效的并行替代方案 在 Windows PowerShell 中 built in可用的替代方案local并行调用是St

随机推荐

  • 在脚本仍在执行时显示结果

    现在为了看到结果 我必须等到整个代码执行完毕 它会挂起直到完成并保持加载状态 一旦完成 它就会显示我正在寻找的所有信息 在脚本仍在运行时是否有办法显示此信息 所以说 如果我在代码顶部的某个地方有一个打印 我希望它在调用时显示 而不是在脚本执
  • 更新 imageView swift 4 的高度约束时无法同时满足约束

    我有一个stack view如下图所示 所以我改变了高度image以编程方式使其适合从我的服务器下载的图像 如果没有图像 则高度限制image将设置为零 这是我这样做的代码 let imageUrl URL string imageStri
  • 查找 CSV 文件/Pandas Dataframe 中标题行的行号

    我正在尝试获取 CSV 文件中包含标题的行的索引或行号 问题是 标题行可以根据我们系统的报告输出上下移动 我无法控制更改此设置 code ht pd read csv file csv test ht get loc Code Code b
  • 如何使用实体框架核心更新与普通 SQL 更新查询相同的多条记录列表?

    通常在 SQL 中我们可以写这样的查询UPDATE users SET isAdult 1 WHERE age gt 18 我想对实体框架核心中满足某些条件的所有行进行一些编辑 我写了这段代码 但出现错误 List
  • tomcat 中基于 JSP Web 应用程序表单的身份验证

    我已将我的应用程序配置为使用基于表单的身份验证 并在 server xml 中设置所需的设置 当我尝试访问受保护的页面时 我被正确重定向到登录页面 在登录页面上 我提供了正确的用户名和密码 但它没有让我登录 而是显示登录错误页面 我正在使用
  • password_hash 每次返回不同的值

    我正在制作一个登录系统 我想对密码进行哈希处理以使其更安全 但它每次都会返回不同的哈希值 甚至无法使用password verify 进行验证 这是我的代码 password password hash password4 PASSWORD
  • 让用户上传并运行Javascript有哪些风险

    如果您有一个 HTML5 游戏厅 允许用户上传一个使用 HTML5 和 Javascript 运行游戏的脚本 假设您的输入没有过滤器 除了只允许 JS 和 HTML 那么潜在的安全风险是什么 陷阱 一种不太可能的可能性是 如果游戏很受欢迎
  • 内部服务器错误

    我在远程服务器上的同一文件夹中有一个 HTML 文件和一个 PHP 文件 从 URL 中 我调用 HTML 文件 而 HTML 文件在提交表单时调用 PHP 文件 但进展并不顺利 当我提交表单时 它显示错误 500内部服务器错误 您要查找的
  • 如何使用 MapReduce API 在映射到云存储之前过滤数据存储数据?

    关于代码实验室here 我们如何在 MapReduce 作业中过滤数据存储数据 而不是获取特定实体类型的所有对象 在下面的映射器管道定义中 唯一的一个输入读取器参数是要处理的实体类型 我在 InputReader 类中看不到可以提供帮助的类
  • Selenium Python:如何网络抓取元素文本

    我正在尝试从轮盘赌游戏中抓取数据 在努力的同时 find element by class name roulette round result position text 我得到这个输出
  • 如何拆分 git repo 并应用 Maven 子模块和 Maven 父模块?

    我需要一些关于如何配置多个存储库的建议 以便它们共享 Maven 父级 并且还配置为 Maven 根项目中的子模块 我正在维护开源项目简单的Java邮件由于可选功能变得越来越大 我计划将项目分成子模块 每个子模块都有自己的 GIT 存储库
  • 如何在方面内使用 ajc 构建参数?

    我需要知道方面内 jar 的名称 以便我可以通过 DeclareParents 创建一个字符串字段 我知道我可以将内容传递给 ajc 编译器 但实际上是否可以使用方面传递的参数 最终结果应该是带有附加字段的类 其中包含我的 jar 的名称作
  • Android 2.2 中的 BackupManager 和 BackupAgent

    我已经查看了文档和示例 BackupRestore 应用程序 并编写了自己的测试应用程序来实现android backupAgent 我延长了BackupAgent类 因为我主要关心的是能够从数据库备份数据 我似乎甚至无法让一个简单的概念验
  • 为什么在非最终类中使用普通 val

    如果课程不是最后一堂课 可能会延长 值有两种可能性 它可能被覆盖并且应该是惰性的 它可能不会被覆盖并且应该是最终的 如果 val 是最终的 您可以假设对它的所有计算都将通过类层次结构进行 如果 val 可能被覆盖 你应该声明它是惰性的 以免
  • 像内置 WP7 一样的图像/照片库

    我正在寻找适用于 Windows Phone 7 的照片库 它的外观和工作方式与内置照片查看器相同 使用轻拂操作幻灯片照片 使用捏合 拖动调整大小 当您轻拂图像时 您可以看到它滑动到下一个图像 并将列表捕捉到该图像 我已经为图像构建了调整大
  • 正则表达式包括字母数字和 _

    我正在尝试创建一个正则表达式来匹配字母数字字符和下划线 这是我的正则表达式 w s 我的印象是这个正则表达式意味着任何字母数字字符 w 下划线 和不 或空格 它是否正确 正则表达式被读取为实际匹配字符串中字符的模式 从左到右 因此您的模式实
  • 最大化直方图下的矩形区域

    我有一个具有整数高度和恒定宽度 1 的直方图 我想最大化直方图下的矩形区域 例如 答案是 6 3 2 使用 col1 和 col2 O n 2 蛮力对我来说很清楚 我想要一个 O n log n 算法 我试图按照最大递增子序列 O n lo
  • Angular4:ng-template 内的组件引用

    我是角度 4 的新手 我想获取 ng template 内组件 验证警报 的句柄
  • 将本机指针转换为 C++\CLI 托管对象引用?

    我有一个通过委托调用的回调 在其中 我需要处理从记录过程到达的缓冲区数据 通常 在非托管上下文中 我可以对 dwParam1 执行reinterpret cast 来获取对象引用 但在托管上下文中 如何将 DWORD PTR 转换为托管对象
  • 多线程场景中的 Microsoft.ACE.OLEDB.12.0 错误

    我在 x64 应用程序中使用Microsoft Access 数据库引擎 2010 Microsoft Office 2016 的一部分 用于处理 mdb 文件 但是 当前版本的 Microsoft Access Database Engi