2015-12-02 35 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

相關問題