ucanaccess:带空格的意外标记

时间:2015-08-20 14:31:28

标签: java ms-access ucanaccess

今天我遇到了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...}
}

第一个查询成功执行但第二个查询失败。

1 个答案:

答案 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();
        }

    }



}