【发布时间】:2015-08-20 14:31:27
【问题描述】:
今天我遇到了 Access DB、Ucanaccess 3.0 和带空格的表名的问题。
解释一下:我有一个巨大的查询并且 ucanaccess 抛出这个异常:
SQLException: UCAExc:::3.0.0 unexpected token: AIRCRAFT
所以我调查并尝试隔离这个问题,我发现了这个:
这个查询抛出异常:
SELECT [Check Task Aircraft Listing].CTAL_Item_Number
,[Check Task Aircraft Listing].CTAL_Check
,[Check Task Aircraft Listing].CTAL_Delete
,[Check Task Aircraft Listing].CTAL_Effective
,[Check Task Aircraft Listing].CTAL_CheckSelect
,[Check Table].[Aircraft]
FROM [Check Table]
INNER JOIN [Check Task Aircraft Listing] ON [Check Table].CHECK = [Check Task Aircraft Listing].CTAL_Check
WHERE (
(([Check Task Aircraft Listing].CTAL_Effective) = True)
AND (([Check Table].[Aircraft]) = 'XXXX')
)
我尝试用 _ 替换空格:
SELECT [Check_Task_Aircraft_Listing].CTAL_Item_Number
,[Check_Task_Aircraft_Listing].CTAL_Check
,[Check_Task_Aircraft_Listing].CTAL_Delete
,[Check_Task_Aircraft_Listing].CTAL_Effective
,[Check_Task_Aircraft_Listing].CTAL_CheckSelect
,[Check_Table].[Aircraft]
FROM [Check_Table]
INNER JOIN [Check_Task_Aircraft_Listing] ON [Check_Table].CHECK = [Check_Task_Aircraft_Listing].CTAL_Check
WHERE (
(([Check_Task_Aircraft_Listing].CTAL_Effective) = True)
AND (([Check_Table].[Aircraft]) = 'XXXX')
)
Ucanaccess 抛出一个新错误:
SQLException: UCAExc:::3.0.0 user lacks privilege or object not found: CHECK_TASK_AIRCRAFT_LISTING
这是正常的:这个对象不存在。第一个异常消失了,所以我认为这是一个问题,但根据 Ucanaccess 网站,这应该可以工作:
特点:
- 字段名称、表名称和视图名称(访问查询)的方括号包括空格(例如,从 [my table] 中选择 [my column])。
编辑:经过更多调查,括号之间的字段/表格名称似乎可以包含一个空格,但不能包含更多
编辑2:澄清
我为了连接访问数据库我使用了一个名为 ConnectDB 的类:
String url = "jdbc:ucanaccess://D:/ADEL/ADEL Local/ADEL_DATA.accdb";
try
{
Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
}
catch (java.lang.ClassNotFoundException e)
{
System.err.print("ClassNotFoundException: ");
System.err.println(e.getMessage());
ErrorFile.writeError(Thread.currentThread().getStackTrace()[2].getLineNumber(), e);
}
try
{
c = java.sql.DriverManager.getConnection(url);
}
catch (SQLException e)
{
System.err.println("SQLException: " + e.getMessage());
ErrorFile.writeError(Thread.currentThread().getStackTrace()[2].getLineNumber(), e);
}
查看以下代码执行查询:
Connection c = ConnectDB.doConnect();
String selectString = "SELECT [Check Task Aircraft Listing].CTAL_Item_Number ,[Check Task Aircraft Listing].CTAL_Check ,[Check Task Aircraft Listing].CTAL_Delete ,[Check Task Aircraft Listing].CTAL_Effective ,[Check Task Aircraft Listing].CTAL_CheckSelect ,[CHECK TABLE].[Aircraft] FROM [CHECK TABLE] INNER JOIN [Check Task Aircraft Listing] ON [CHECK TABLE].CHECK = [Check Task Aircraft Listing].CTAL_Check WHERE ( (([Check Task Aircraft Listing].CTAL_Effective) = True) AND (([CHECK TABLE].[Aircraft]) = 'XXXX') ) ";
try
{
stmt = c.createStatement();
ResultSet data = stmt.executeQuery(selectString);
while (data.next())
{...use data...}
}
第一个查询成功执行,但第二个查询失败。
【问题讨论】:
-
很抱歉,编辑 2 没有帮助,因为您的查询有效。也编辑了我的答案。
-
我尝试了一个新的数据库并且它可以工作,所以我认为我的数据库有问题但我不明白:它可以通过 ODBC:JDBC 驱动程序找到
-
这是因为技术堆栈完全不同,原始堆栈可能会在您的数据库的特定情况下做更多的事情。如果没有您的数据库副本,我不能再说什么,我会分析读取您的数据库并在检查任务飞机列表表上执行查询的 ucanaccess 控制台输出是什么。您确定您使用的 hsqldb 版本来自 ucanaccess 发行版吗?
标签: java ms-access ucanaccess