今天我遇到了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网站,这应该有效:
特点:
- 字段名称,表名和视图名称(访问查询)的方括号,包括空格(例如,从[我的表]中选择[我的列])。
编辑:经过更多调查后,支架之间的字段/表格名称似乎可以包含一个空格但不能更多
编辑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...}
}
第一个查询成功执行但第二个查询失败。
答案 0 :(得分:0)
实际上你的诊断是错误的(并且第二次尝试没有意义,因为错误的表名引起的错误不是某种事情的证据)。
此外,空格的数量完全无关紧要。另一个有效的例子可能是:
从[my table bla bla bla]中选择[my column bla bla bla]。
我刚刚在名为检查任务飞机列表和检查表(使用您的查询中指定的列创建)的两个表上尝试了查询,它的工作正常完美的3.0.0。 请帮助我们帮助您重新创建问题。
编辑:尝试在没有表的新数据库上执行以下代码,并在创建所需表后很好地执行查询:
package xxx;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class UcaT {
/**
* @param args
* @throws SQLException
*/
public static void main(String[] args) throws SQLException {
Connection c= DriverManager.getConnection("jdbc:ucanaccess://c:\\db\\new_database_without_tables.accdb");
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
{
Statement stmt = c.createStatement();
stmt.execute("create table [Check Table] (id counter PRIMARY KEY,[CHECK] text,Aircraft text)");
stmt.execute("create table [Check Task Aircraft Listing] (id counter PRIMARY KEY,CTAL_Item_Number text,CTAL_Check text, CTAL_Delete text, CTAL_Effective yesno, CTAL_CheckSelect text)");
ResultSet data = stmt.executeQuery(selectString);
System.out.println("ok");
}
catch(Exception e){
e.printStackTrace();
}
}
}