使用 Java Ucanaccess 在 ms-Access 中恢复数据和存储的查询

Posted

技术标签:

【中文标题】使用 Java Ucanaccess 在 ms-Access 中恢复数据和存储的查询【英文标题】:Recover data and stored queries in ms-Access using Java Ucanaccess 【发布时间】:2016-04-26 15:18:50 【问题描述】:

我有一个 Access 数据库。该数据库包含表和存储的查询。我的目标是使用 Java Ucanaccess(一个 JDBC 连接器)来使用存储在 Access 文件中的数据并使用 Jaspersoft 创建报告。

查询普通表工作:

Connection conn = ConnexionUtils.getConnection();
        Statement stmt = conn.createStatement();
        String query = "select * from Tab_BOUT";
        ResultSet rs = stmt.executeQuery(query);
        int cpt = 0;
        while ( rs.next() ) 
            int numColumns = rs.getMetaData().getColumnCount();
            for ( int i = 1 ; i <= numColumns ; i++ ) 
                if (i > 1) System.out.print(",  ");
                String columnValue = rs.getString(i);
                System.out.print(columnValue + " " + rs.getMetaData().getColumnName(i));
            
        

但问题是我有在 Access 中使用其他查询的对象。所以当我尝试调用查询时,它不起作用:

“RQT_STORED”,例如,包含:

"SELECT Tab_STO_livraisons.[LIV-TIE_num], Req_BOUT_articles_tous.ART_code_EAN FROM (Tab_STO_livraisons INNER JOIN Tab_STO_détails ON (Tab_STO_livraisons.LIV_num = Tab_STO_détails.[STO-LIV_num]) AND (Tab_STO_livraisons.[LIV-TIE_num] = Tab_STO_détails.[STO-TIE_num])) INNER JOIN Req_BOUT_articles_tous ON Tab_STO_détails.[STO-ART_id] = Req_BOUT_articles_tous.ART_code ORDER BY Tab_STO_livraisons.[LIV-TIE_num], Tab_STO_livraisons.LIV_num, Tab_STO_détails.[STO-ART_id]";

查询在 Access 中有效,但在 Java 中无效。有谁知道如何做到这一点或有更好的解决方案?

编辑: 这是一个查询示例:Select * from Req_VENT_librairie_nouvelles_pages_analyse

access中真正的查询:

SELECT Tab_STO_livraisons.[LIV-TIE_num], Tab_STO_livraisons.LIV_num, Tab_STO_livraisons.LIV_date_livraison, Tab_STO_livraisons.LIV_type_facturation, Tab_STO_détails.[STO-ART_id], Req_BOUT_articles_tous.ART_code_EAN, Tab_STO_détails.STO_nombre, Tab_STO_livraisons.LIV_bdc, Tab_STO_livraisons.LIV_fact_51, Tab_STO_livraisons.LIV_fact_31
FROM (Tab_STO_livraisons INNER JOIN Tab_STO_détails ON (Tab_STO_livraisons.LIV_num = Tab_STO_détails.[STO-LIV_num]) AND (Tab_STO_livraisons.[LIV-TIE_num] = Tab_STO_détails.[STO-TIE_num])) INNER JOIN Req_BOUT_articles_tous ON Tab_STO_détails.[STO-ART_id] = Req_BOUT_articles_tous.ART_code
ORDER BY Tab_STO_livraisons.[LIV-TIE_num], Tab_STO_livraisons.LIV_num, Tab_STO_détails.[STO-ART_id];

以及错误信息:

net.ucanaccess.jdbc.UcanaccessSQLException:UCAExc:::3.0.4 用户缺少权限或找不到对象:REQ_VENT_LIBRAIRIE_NOUVELLES_PAGES_ANALYSE 在 net.ucanaccess.jdbc.UcanaccessStatement.executeQuery(UcanaccessStatement.java:211) 在 view.QueryData.main(QueryData.java:32) 引起:java.sql.SQLSyntaxErrorException:用户缺少权限或找不到对象:REQ_VENT_LIBRAIRIE_NOUVELLES_PAGES_ANALYSE 在 org.hsqldb.jdbc.JDBCUtil.sqlException(未知来源) 在 org.hsqldb.jdbc.JDBCUtil.sqlException(未知来源) 在 org.hsqldb.jdbc.JDBCStatement.fetchResult(未知来源) 在 org.hsqldb.jdbc.JDBCStatement.executeQuery(未知来源) 在 net.ucanaccess.jdbc.UcanaccessStatement.executeQuery(UcanaccessStatement.java:208) ... 1 更多 引起:org.hsqldb.HsqlException:用户缺少权限或找不到对象:REQ_VENT_LIBRAIRIE_NOUVELLES_PAGES_ANALYSE 在 org.hsqldb.error.Error.error(未知来源) 在 org.hsqldb.error.Error.error(未知来源) 在 org.hsqldb.SchemaManager.getTable(未知来源) 在 org.hsqldb.ParserDQL.readTableName(未知来源) 在 org.hsqldb.ParserDQL.readTableOrSubquery(未知来源) 在 org.hsqldb.ParserDQL.XreadTableReference(未知来源) 在 org.hsqldb.ParserDQL.XreadFromClause(未知来源) 在 org.hsqldb.ParserDQL.XreadTableExpression(未知来源) 在 org.hsqldb.ParserDQL.XreadQuerySpecification(未知来源) 在 org.hsqldb.ParserDQL.XreadSimpleTable(未知来源) 在 org.hsqldb.ParserDQL.XreadQueryPrimary(未知来源) 在 org.hsqldb.ParserDQL.XreadQueryTerm(未知来源) 在 org.hsqldb.ParserDQL.XreadQueryExpressionBody(未知来源) 在 org.hsqldb.ParserDQL.XreadQueryExpression(未知来源) 在 org.hsqldb.ParserDQL.compileCursorSpecification(未知来源) 在 org.hsqldb.ParserCommand.compilePart(未知来源) 在 org.hsqldb.ParserCommand.compileStatements(未知来源) 在 org.hsqldb.Session.executeDirectStatement(未知来源) 在 org.hsqldb.Session.execute(未知来源) ... 4 更多

【问题讨论】:

我的英语不是很好,我试图将“请求访问”翻译成查询,但我认为我的“RQT_STORED”实际上就是你所说的“视图” 请edit您的问题显示您正在使用的实际 SQL 语句(例如,SELECT * FROM RQT_STORED ...?)和您收到的错误消息(或者更好的是完整的堆栈跟踪)当您尝试运行它时。 UCanAccess 确实打算支持(大多数)已保存的 SELECT 查询,因此您的查询可能有些特殊。还要确保您使用的是最新版本的 UCanAccess(当前版本为 3.0.4)。 对于它的价值,我刚刚尝试使用从您的问题中逐字复制的查询SELECT * FROM RQT_STORED,UCanAccess 3.0.4 没有任何投诉。 @GordThompson,它实际上仍然无法正常工作。我编辑了我的第一篇文章! 关于信息,我的一些观点是查询 mysql 数据库。这会是个大问题吗? 【参考方案1】:

我的一些观点是查询 MySQL 数据库。这会是个大问题吗?

是的。 UCanAccess 可以与 Access 链接表(指向另一个 Access 数据库中的表的链接表)一起使用,但它不能与 ODBC 链接表(指向 ODBC 数据源中的表的链接表,如 MySQL 或 SQL Server)一起使用。

【讨论】:

以上是关于使用 Java Ucanaccess 在 ms-Access 中恢复数据和存储的查询的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 UCanAccess 插入行?

Java 错误 - net.ucanaccess.jdbc.UcanaccessSQLException:格式错误的字符串:'

使用 Java 和 UCanAccess 更新备注字段中的日期时间和字符串

java.Sql.SQLException,无法加载类 net.ucanaccess.jdbc.UcanaccessDriver

java.lang.ClassNotFoundException:net.ucanaccess.jdbc.ucanaccessDriver

带有 UCanAccess 的 java.util.regex.PatternSyntaxException