“常规错误无法从Access ODBC打开注册表项临时(volatile)…”
我尝试了以下方法:
private String password = ""; private String dbName = "dataHC.accdb"; private String bd = dbName + ";PWD=" + password; String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ="+bd+";"; private Connection conn = null; //Connect public void connect() { try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); conn = DriverManager.getConnection(url); if (conn != null) System.out.println("Conexión a base de datos "+dbName+". listo"); }catch(SQLException e){ System.out.println(e); }catch(ClassNotFoundException e){ System.out.println(e); } }
字体: http : //www.jc-mouse.net/base-de-datos/consultas-con-parametros-en-access-y-java
我得到了这个错误:
[Microsoft] [ODBC Microsoft Access驱动程序]常规错误无法打开注册表项临时(易失性)Ace DSN进程0x7f8线程0x1174 DBC
特别
java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver]General error Unable to open registry key Temporary (volatile) Ace DSN for process 0x7f8 Thread 0x1174 DBC 0x8dc8d78 Jet'. Exception in thread "main" java.lang.NullPointerException at depuracionDB.consultap(depuracionDB.java:67) at depuracionDB.main(depuracionDB.java:103)
我正在使用eclipse IDE Luna和Java版本“1.7.0_45”(64位)
原因
一般错误无法打开注册表项临时(易变)Ace DSN进程…
这是由于以下原因之一,当前进程无法打开Access数据库文件时Access数据库引擎(也称为“ACE”)ODBC驱动程序生成的顶级错误消息:
-
其他一些进程“专门”打开了数据库。
-
其他一些进程最初在Access中以“共享”方式打开数据库文件,并且有一些待定的结构修改,需要对文件进行“独占”访问。 此类待处理修改的示例是对尚未保存的模块代码的编辑,或者在设计视图中打开表单或报表。
-
当前进程正在运行的帐户没有足够的文件系统权限来打开数据库文件或其所在的文件夹。
-
当前进程运行的帐户没有足够的注册表权限来访问
HKLM\SOFTWARE\ODBC
项下的值。 -
数据库文件根本不存在。
当仅报告顶级错误消息时,较早的“Jet”ODBC驱动程序产生更直观的错误消息。 当另一个进程对文件执行“Open Exclusive”时,错误消息是
不能使用’(未知)’; 文件已在使用中。
当文件有待处理的设计更改时,错误消息说
数据库已被未知用户置于某个状态,阻止其被打开或锁定。
但是,当我们只看到ACE ODBC驱动程序生成的顶级消息时,我们看到的是
一般错误无法打开注册表项临时(易变)Ace DSN进程…
这是因为两个驱动程序都返回多个错误消息,但它们以不同的顺序返回它们。 Jet消息是……
错误[HY000] [Microsoft] [ODBC Microsoft Access驱动程序]数据库已被未知用户置于某种状态,阻止其被打开或锁定。
错误[01000] [Microsoft] [ODBC Microsoft Access驱动程序]常规警告无法打开注册表项’临时(易失性)Jet DSN进程0xed4线程0x1204 DBC 0xab004 Jet’。
错误[IM006] [Microsoft] [ODBC驱动程序管理器]驱动程序的SQLSetConnectAttr失败
错误[01000] [Microsoft] [ODBC Microsoft Access驱动程序]常规警告无法打开注册表项’临时(易失性)Jet DSN进程0xed4线程0x1204 DBC 0xab004 Jet’。
错误[HY000] [Microsoft] [ODBC Microsoft Access驱动程序]数据库已被未知用户置于某种状态,阻止其被打开或锁定。
…… ACE消息是:
错误[HY000] [Microsoft] [ODBC Microsoft Access驱动程序]常规错误无法打开注册表项临时(易失性)Ace DSN进程0xf6c线程0x1568 DBC 0x6347fec Jet’。
错误[IM006] [Microsoft] [ODBC驱动程序管理器]驱动程序的SQLSetConnectAttr失败
错误[HY000] [Microsoft] [ODBC Microsoft Access驱动程序]常规错误无法打开注册表项临时(易失性)Ace DSN进程0xf6c线程0x1568 DBC 0x6347fec Jet’。
错误[HY000] [Microsoft] [ODBC Microsoft Access驱动程序]数据库已被未知用户置于某种状态,阻止其被打开或锁定。
错误[HY000] [Microsoft] [ODBC Microsoft Access驱动程序]常规错误无法打开注册表项临时(易失性)Ace DSN进程0xf6c线程0x1568 DBC 0x6347fec Jet’。
错误[HY000] [Microsoft] [ODBC Microsoft Access驱动程序]常规错误无法打开注册表项临时(易失性)Ace DSN进程0xf6c线程0x1568 DBC 0x6347fec Jet’。
错误[HY000] [Microsoft] [ODBC Microsoft Access驱动程序]数据库已被未知用户置于某种状态,阻止其被打开或锁定。
解决方案
方案1和方案2(另一个进程对文件具有“独占”锁定):
确保数据库文件未被任何其他进程打开 – 通常这意味着只关闭Access应用程序本身 – 然后从外部应用程序重新尝试ODBC操作。 重新启动计算机是确保终止任何其他此类进程并放弃对数据库文件的声明的一种方法。
方案3(文件/文件夹权限不足):
调整权限或将文件移动到用户可以打开文件的位置。 将数据库文件放在驱动器的根文件夹中是导致此类问题的常见原因。
方案4(注册表权限不足):
调整注册表权限以允许该帐户访问HKLM\SOFTWARE\ODBC
项。 在这种情况下,最常见的原因是IIS进程在没有正常“用户”权限的帐户下运行。 在这种情况下,请记住, 您不应该使用带有IIS的Access数据库 。
场景5(数据库文件不存在):
修复连接字符串,使其包含现有文件的有效路径。
原因6(否则未涵盖)在更改文件名后,忘记更改要尝试打开的文件名。 即试图打开一个不存在的文件。
原因5(戈德的其他优秀解释未涵盖)
用户错误 – 例如,尝试使用ACE驱动程序读取未设计用于处理的内容(如Excel文件),该函数在早期版本的函数中使用Jet ODBC驱动程序读取。 即使消息模糊不清,它也会在开放时正确地捕获错误,而不是在您认为开放成功之后。 :/
在这种情况下,您需要提及访问db文件的完整路径。 在下面提到的URL中,两个扩展之间必须有空格(* .mdb,* .accdb)
例如:
String database="C:/Users/GIRI/Desktop/fdsfkdsfj/abc.accdb"; String url="jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + database + ";DriverID=22;READONLY=true";
try { String conUrl = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + filepath; Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); con=DriverManager.getConnection(conUrl); } catch(SQLException s) { System.out.println(s); }
我认为此链接可以帮助您http://java2carrer.blogspot.in/2013/06/insert-data-into-ms-access-from-excel.html
请尝试这个代码我尝试在win 7终极64位与office 2013 64位
package dbase.dbconnection; import java.sql.*; public class MSAccessDbConnect { public static void main(String args[]) throws Exception { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String password = ""; String dbName = "D:/maven_ejb_train/DATA/EmpTest.accdb"; String bd = dbName; // + ";PWD=" + password; String connURL = "jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + dbName; System.out.println("connURL ===== " + connURL); String sql2 = "select * from Employees "; Connection conn = DriverManager.getConnection(connURL, "", ""); System.out.println("aaa 111"); ResultSet rs = conn.createStatement().executeQuery(sql2); System.out.println("aaa 222"); while (rs.next()) { System.out.println("Name: " + rs.getString("EMP_NA") + " ID: " + rs.getString("EMP_NO")); } rs.close(); conn.close(); } }