2016-10-04 245 views
1

我需要使用UCanAccess從MS Access的視圖讀取數據。我有C上兩個數據庫:\ databases中UCanAccess無法讀取查詢「... FROM TableName IN'FileSpec'」

  1. DBA(包含表:TableOfDBa)。

enter image description here

  • DBB(包含QueryLinkTable {TableOfDBa的視圖})。
  • enter image description here

    QueryLinkTable是:

    SELECT * FROM TableOfDBa IN 'C:\DataBases\DBa.mdb'; 
    

    的代碼是:

    package es.fips; 
    
    import java.sql.Connection; 
    import java.sql.DatabaseMetaData; 
    import java.sql.DriverManager; 
    import java.sql.ResultSet; 
    import java.sql.SQLException; 
    import java.sql.Statement; 
    
    public class ReadData { 
        private static String pathDB = "//C:/DataBases/DBb.mdb"; 
    
        public static void main(String[] args) { 
         Connection conn = getConnectionOn(); 
         String nameView = "QueryLinKTable"; 
    
         if(conn != null){ 
          System.out.println("Connected Data Base =D"); 
    
          if(thereAreViews(conn)){     
           // This can not read the query from view 
           printView(conn, nameView); 
          } 
    
          printView(conn, nameView); 
         } 
        } 
    
        public static Connection getConnectionOn() { 
         Connection myConnection = null; 
         try { 
          myConnection = DriverManager.getConnection("jdbc:ucanaccess:" + pathDB); 
          return myConnection; 
    
         } catch (SQLException e) { 
          System.out.println("Error connecting"); 
          return null; 
         } 
        } 
    
        public static boolean thereAreViews(Connection oneConn) { 
         try { 
          DatabaseMetaData metaDB = oneConn.getMetaData(); 
          String[] types = { "VIEW" }; 
          int numViews = 0; 
    
          ResultSet rs = metaDB.getTables(null, null, null, types); 
          while (rs.next()) { 
           System.out.println("View " + (numViews + 1) + ": " + rs.getString(3)); 
           numViews++; 
          } 
    
          if (numViews > 0) { 
           return true; 
          } else { 
           System.out.println("There are no views"); 
           return false; 
          } 
    
         } catch (SQLException e) { 
          e.printStackTrace(); 
          return false; 
         } 
        } 
    
        public static void printView(Connection oneConn, String nameView) { 
         try { 
          Statement st = oneConn.createStatement(); 
          String query = "SELECT * FROM " + nameView; 
          ResultSet rs = st.executeQuery(query); 
    
          while (rs.next()) { 
           System.out.println("Read! =D"); 
          } 
    
         } catch (SQLException e) { 
          e.printStackTrace(); 
         } 
        } 
    } 
    

    錯誤是:

    Connected Data Base =D 
    There are no views 
    net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::3.0.6 usuario no tiene privilegios suficientes o objeto no encontrado: QUERYLINKTABLE 
        at net.ucanaccess.jdbc.UcanaccessStatement.executeQuery(UcanaccessStatement.java:211) 
        at es.fips.ReadData.printView(ReadData.java:69) 
        at es.fips.ReadData.main(ReadData.java:25) 
    Caused by: java.sql.SQLSyntaxErrorException: usuario no tiene privilegios suficientes o objeto no encontrado: QUERYLINKTABLE 
        at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) 
        at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) 
        at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source) 
        at org.hsqldb.jdbc.JDBCStatement.executeQuery(Unknown Source) 
        at net.ucanaccess.jdbc.UcanaccessStatement.executeQuery(UcanaccessStatement.java:208) 
        ... 2 more 
    Caused by: org.hsqldb.HsqlException: usuario no tiene privilegios suficientes o objeto no encontrado: QUERYLINKTABLE 
        at org.hsqldb.error.Error.error(Unknown Source) 
        at org.hsqldb.error.Error.error(Unknown Source) 
        at org.hsqldb.ParserDQL.readTableName(Unknown Source) 
        at org.hsqldb.ParserDQL.readTableOrSubquery(Unknown Source) 
        at org.hsqldb.ParserDQL.XreadTableReference(Unknown Source) 
        at org.hsqldb.ParserDQL.XreadFromClause(Unknown Source) 
        at org.hsqldb.ParserDQL.XreadTableExpression(Unknown Source) 
        at org.hsqldb.ParserDQL.XreadQuerySpecification(Unknown Source) 
        at org.hsqldb.ParserDQL.XreadSimpleTable(Unknown Source) 
        at org.hsqldb.ParserDQL.XreadQueryPrimary(Unknown Source) 
        at org.hsqldb.ParserDQL.XreadQueryTerm(Unknown Source) 
        at org.hsqldb.ParserDQL.XreadQueryExpressionBody(Unknown Source) 
        at org.hsqldb.ParserDQL.XreadQueryExpression(Unknown Source) 
        at org.hsqldb.ParserDQL.compileCursorSpecification(Unknown Source) 
        at org.hsqldb.ParserCommand.compilePart(Unknown Source) 
        at org.hsqldb.ParserCommand.compileStatements(Unknown Source) 
        at org.hsqldb.Session.executeDirectStatement(Unknown Source) 
        at org.hsqldb.Session.execute(Unknown Source) 
        ... 5 more 
    

    我將不勝感激,如果你知道任何解決方案

    回答

    0

    目前(截至3.0.6版本),UCanAccess不支持語法

    SELECT * FROM TableName IN 'C:\Path\To\DbFile.mdb' 
    

    如果您嘗試使用DBb.mdb的開UCanAccess控制檯(console.bat或console.sh),你會看到

    Error occured at the first loading attempt of QueryLinKTable 
    Converted view was :CREATE VIEW QUERYLINKTABLE AS SELECT * 
    FROM TableOfDBa IN 'C:\Users\Public\test\DBa.mdb' 
    Error message was :unexpected token: IN : line: 2 
    

    在你的情況,你需要創建一個實際的鏈接表在DBb.mdb名爲[TableOfDBa]這點在DBa.mdb表,然後在DBb.mdb視圖(保存查詢)更改爲

    SELECT * FROM TableOfDBa 
    

    Untitled.png

    +0

    沒關係啊! = D,非常感謝您的幫助。 – ferpaxecosanxez