2015-12-02 32 views
0

我在这里得到了一些代码如何使用java中的sql查询在MSAccess数据库文件中列出所有表的名称?

String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + f.getPath() + ";"; 
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
        Connection conn = DriverManager.getConnection(url); 
        Statement st=conn.createStatement(); 
        String query="SELECT name FROM MSysObjects WHERE Type=1 AND Flags=0"; 
        ResultSet rs=st.executeQuery(query); 
        ArrayList<String> tableNames=new ArrayList<String>(); 
        while(rs.next()){ 
         String name=rs.getString(1); 
         tableNames.add(name); 
        } 

但有一些问题

[Microsoft][ODBC Microsoft Access Driver] Record(s) cannot be read; no read permission on 'MSysObjects'." 

和我搜索了这个问题,刚刚发现这个:social.msdn.microsoft.com/Forums/sqlserver/en-US/…“ 因为MSysObjects是Access系统表,管理员用户没有权限读取其中的数据“。 我看了答案,但实际上我想通过编程获得权限,有人能帮助我吗?非常感谢

回答

1

似乎访问不允许查询MSysObjects。您是否按照文章中的步骤为用户提供了足够的权限?

反正JDBC也有自己的API,它可以读取数据库的元数据:

Connection conn = ... 
DatabaseMetaData metaData = conn.getMetaData(); 
ResultSet rs = metaData.getTables(null, null, "%", null); 
while (rs.next()) { 
     String name = rs.getString(3); // see javadoc of DatabaseMetaData 
     tableNames.add(name); 
} 
+0

非常感谢!我没有在文章中试过答案,因为它必须获得用户的许可,但不能获得程序的许可(假设我只在程序中有文件名和路径)。此外,我已经尝试过你的代码和它的工作,但有太多的表名不仅仅是我想要的名字,而且还有像'MSysAccessObjects','MSysQueries'等系统表。我怎么解决这个问题?再次感谢。 – yao

+0

@yao查看getTables方法的参数。传递非null参数可能会允许您将返回的表限制为有趣的参数...... – wero

相关问题