使用 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 中恢复数据和存储的查询的主要内容,如果未能解决你的问题,请参考以下文章
Java 错误 - net.ucanaccess.jdbc.UcanaccessSQLException:格式错误的字符串:'
使用 Java 和 UCanAccess 更新备注字段中的日期时间和字符串
java.Sql.SQLException,无法加载类 net.ucanaccess.jdbc.UcanaccessDriver
java.lang.ClassNotFoundException:net.ucanaccess.jdbc.ucanaccessDriver