<h2>原因</h2>
<blockquote>
<p>General error Unable to open registry key Temporary (volatile) Ace DSN for process ...</p>
</blockquote>
<p>这是当当前进程由于以下原因之一无法打开Access数据库文件时,Access数据库引擎(也称为“ACE”)ODBC驱动程序生成的顶级错误消息:</p>
<ol>
<li><p>其他进程已“独占”打开数据库。</p></li>
<li><p>另一个进程最初在Access中将数据库文件作为“共享”打开,然后
有一些挂起的结构修改需要“独占”访问该文件。此类挂起修改的示例包括尚未保存的模块代码的编辑,或在“设计”视图中打开窗体或报表。</p></li>
<li><p>运行当前进程的帐户没有足够的文件系统权限来打开数据库文件或其所在的文件夹。</p></li>
<li><p>运行当前进程的帐户没有足够的注册表权限访问<code>HKLM\SOFTWARE\ODBC</code>项下的值。</p></li>
<li><p>数据库文件根本不存在。</p></li>
<li><p>您试图打开的数据库需要更新版本的Microsoft Access。</p></li>
</ol>
<p>当只报告顶级错误消息时,早期的“Jet”ODBC驱动程序会生成一些更直观的错误消息。当另一个进程对文件执行“Open Exclusive”时,错误消息是</p>
<blockquote>
<p>Could not use '(unknown)'; file already in use.</p>
</blockquote>
<p>当文件有挂起的设计更改时,错误消息说</p>
<blockquote>
<p>The database has been placed in a state by an unknown user that prevents it from being opened or locked.</p>
</blockquote>
<p>然而,当我们只看到由ACE ODBC驱动程序生成的顶级消息时,我们看到的只是</p>
<blockquote>
<p>General error Unable to open registry key Temporary (volatile) Ace DSN for process ...</p>
</blockquote>
<p>这是因为两个驱动程序都返回多个错误消息,但返回顺序不同。喷气式飞机的信息是。。。</p>
<blockquote>
<p>ERROR [HY000] [Microsoft][ODBC Microsoft Access Driver] The database has been placed in a state by an unknown user that prevents it from being opened or locked.</p>
<p>ERROR [01000] [Microsoft][ODBC Microsoft Access Driver]General Warning Unable to open registry key 'Temporary (volatile) Jet DSN for process 0xed4 Thread 0x1204 DBC 0xab004 Jet'.</p>
<p>ERROR [IM006] [Microsoft][ODBC Driver Manager] Driver's SQLSetConnectAttr failed</p>
<p>ERROR [01000] [Microsoft][ODBC Microsoft Access Driver]General Warning Unable to open registry key 'Temporary (volatile) Jet DSN for process 0xed4 Thread 0x1204 DBC 0xab004 Jet'.</p>
<p>ERROR [HY000] [Microsoft][ODBC Microsoft Access Driver] The database has been placed in a state by an unknown user that prevents it from being opened or locked.</p>
</blockquote>
<p>。。。当ACE消息是:</p>
<blockquote>
<p>ERROR [HY000] [Microsoft][ODBC Microsoft Access Driver]General error Unable to open registry key Temporary (volatile) Ace DSN for process 0xf6c Thread 0x1568 DBC 0x6347fec Jet'.</p>
<p>ERROR [IM006] [Microsoft][ODBC Driver Manager] Driver's SQLSetConnectAttr failed</p>
<p>ERROR [HY000] [Microsoft][ODBC Microsoft Access Driver]General error Unable to open registry key Temporary (volatile) Ace DSN for process 0xf6c Thread 0x1568 DBC 0x6347fec Jet'.</p>
<p>ERROR [HY000] [Microsoft][ODBC Microsoft Access Driver] The database has been placed in a state by an unknown user that prevents it from being opened or locked.</p>
<p>ERROR [HY000] [Microsoft][ODBC Microsoft Access Driver]General error Unable to open registry key Temporary (volatile) Ace DSN for process 0xf6c Thread 0x1568 DBC 0x6347fec Jet'.</p>
<p>ERROR [HY000] [Microsoft][ODBC Microsoft Access Driver]General error Unable to open registry key Temporary (volatile) Ace DSN for process 0xf6c Thread 0x1568 DBC 0x6347fec Jet'.</p>
<p>ERROR [HY000] [Microsoft][ODBC Microsoft Access Driver] The database has been placed in a state by an unknown user that prevents it from being opened or locked.</p>
</blockquote>
<h2>解决方案</h2>
<h3>场景1和场景2(另一个进程在文件上有一个“独占”锁):</h3>
<p>确保数据库文件不被任何其他进程打开(通常意味着只关闭Access应用程序本身),然后从外部应用程序重新尝试ODBC操作。重新启动计算机是确保任何其他此类进程已终止并放弃对数据库文件的声明的一种方法。</p>
<h3>场景3(文件/文件夹权限不足):</h3>
<p>调整权限或将文件移动到用户可以打开文件的位置。将数据库文件放在驱动器的根文件夹中是此类问题的常见原因。</p>
<h3>场景4(注册表权限不足):</h3>
<p>调整注册表权限以允许帐户访问<code>HKLM\SOFTWARE\ODBC</code>项。在这种情况下,最常见的原因是IIS进程在不具有正常“用户”权限的帐户下运行。在这种情况下,请记住,无论如何,您都不应该将Access数据库与IIS一起使用。</p>
<h3>场景5(数据库文件不存在):</h3>
<p>修复连接字符串,使其包含指向现有文件的有效路径。</p>
<h3>场景6(数据库文件需要更新版本的Access):</h3>
<p>升级Microsoft Access或可再发行的Access数据库引擎(如果可用)。</p>