2017-01-25 1 views
0

Это мой первый раз, когда я использовал ucanaccess, так как я только что узнал, что моя предыдущая версия Eclipse не будет работать с Java 1.8, поэтому я могу перейти к моей базе данных доступа , Я знаком с Java-программированием и RDBMS (в настоящее время использую Oracle), поэтому я не понимаю, почему я получаю сообщение об ошибке с моим кодом.Выполнение многострочного запроса не работает с псевдонимом таблицы, где выполняется однострочный запрос

Это код, который я использую для подключения к БД (переменная DBFILE является объектом File используется для хранения пути доступа к БД):

\t \t try 
 
\t \t { 
 
\t \t \t String urlDB = "jdbc:ucanaccess://"+ dbFile.getAbsolutePath(); 
 
\t \t \t 
 
\t \t \t Connection conn = DriverManager.getConnection(urlDB, "", ""); 
 
\t \t \t System.out.println("Connection Successful\n"); 
 
\t \t \t 
 
\t \t \t Statement test = conn.createStatement(); 
 
/* \t \t \t ResultSet rs = test.executeQuery("SELECT e.* " 
 
                 + "FROM Employees e" 
 
                 + "WHERE e.EmployeeNo LIKE 'H%'" 
 
                 + "ORDER BY e.LastName"); 
 

 
\t \t \t System.out.println(); //spacing 
 

 
\t \t \t //retrieve column data 
 
\t \t \t while(rs.next()) 
 
\t \t \t { 
 
\t \t \t \t //can get data by column name instead of ID 
 
\t \t \t \t String id = rs.getString("ID"); 
 
\t \t \t \t String fName = rs.getString("FirstName"); 
 
\t \t \t \t String lName = rs.getString("LastName"); 
 
\t \t \t \t String dName = rs.getString("DisplayName"); 
 
\t \t \t \t \t \t 
 
\t \t \t \t System.out.println(id + "\t" + fName + "\t" + lName + "\t"); 
 
\t \t \t \t 
 
\t \t \t } 
 
*/ \t \t \t 
 
\t \t \t ResultSet rs = test.executeQuery("SELECT e.* FROM Employees e WHERE e.EmployeeNo LIKE '1%' ORDER BY e.LastName"); 
 
\t \t \t 
 
\t \t \t //get table information (i.e. column names) 
 
\t \t \t ResultSetMetaData rsmd = rs.getMetaData(); 
 
\t \t \t int dbColumnCount = rsmd.getColumnCount(); 
 
\t \t \t 
 
/* \t \t \t //db columns starts at 1 not 0 
 
\t \t \t for (int count = 1; count <= dbColumnCount; count++) 
 
\t \t \t { 
 
\t \t \t \t System.out.print(rsmd.getColumnName(count) + "\t"); 
 
\t \t \t } 
 
*/ \t \t \t 
 
\t \t \t System.out.format("%5s%10s%15s%20s%n", rsmd.getColumnName(1), rsmd.getColumnName(2), 
 
\t \t \t \t \t rsmd.getColumnName(3), rsmd.getColumnName(4)); 
 
\t \t \t //System.out.println(); 
 
\t \t \t 
 
\t \t \t while(rs.next()) 
 
\t \t \t { 
 
\t \t \t \t //can get data by column name instead of ID 
 
\t \t \t \t String id = rs.getString("ID"); 
 
\t \t \t \t String fName = rs.getString("FirstName"); 
 
\t \t \t \t String lName = rs.getString("LastName"); 
 
\t \t \t \t String dName = rs.getString("DisplayName"); 
 
\t \t \t \t \t \t 
 
\t \t \t \t //System.out.println(id + "\t" + fName + "\t" + lName + "\t"); 
 
\t \t \t \t System.out.format("%5s%10s%15s%20s%n", id, fName, lName, dName); 
 
\t \t \t } 
 
\t \t \t 
 
\t \t } 
 
\t \t catch (Exception e) 
 
\t \t { 
 
\t \t \t e.printStackTrace(); 
 
\t \t \t System.err.println("Could not connect to the Database"); 
 
\t \t \t System.err.println(e.getMessage()); 
 
\t \t } \t \t 
 
\t }

Первый вызов ResultSet (многострочный запрос) выдает следующее исключение:

net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::4.0.0 user lacks privilege or object not found: E 
 
\t at net.ucanaccess.jdbc.UcanaccessStatement.executeQuery(UcanaccessStatement.java:210) 
 
\t at DBConnect.<init>(InOutBoard.java:78) 
 
\t at InOutBoard.main(InOutBoard.java:47) 
 
Caused by: java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: E 
 
\t at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) 
 
\t at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) 
 
\t at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source) 
 
\t at org.hsqldb.jdbc.JDBCStatement.executeQuery(Unknown Source) 
 
\t at net.ucanaccess.jdbc.UcanaccessStatement.executeQuery(UcanaccessStatement.java:208) 
 
\t ... 2 more 
 
Caused by: org.hsqldb.HsqlException: user lacks privilege or object not found: E 
 
\t at org.hsqldb.error.Error.error(Unknown Source) 
 
\t at org.hsqldb.error.Error.error(Unknown Source) 
 
\t at org.hsqldb.QuerySpecification.resolveColumnReferencesForAsterisk(Unknown Source) 
 
\t at org.hsqldb.QuerySpecification.resolveReferences(Unknown Source) 
 
\t at org.hsqldb.QueryExpression.resolve(Unknown Source) 
 
\t at org.hsqldb.ParserDQL.compileCursorSpecification(Unknown Source) 
 
\t at org.hsqldb.ParserCommand.compilePart(Unknown Source) 
 
\t at org.hsqldb.ParserCommand.compileStatements(Unknown Source) 
 
\t at org.hsqldb.Session.executeDirectStatement(Unknown Source) 
 
\t at org.hsqldb.Session.execute(Unknown Source) 
 
\t ... 5 more 
 
Could not connect to the Database 
 
UCAExc:::4.0.0 user lacks privilege or object not found: E

тогда как если я запустил второй вызов ResultSet (однострочный запрос), данные будут правильно возвращены из таблицы. Теперь, насколько я могу судить (кроме перекрытия нескольких строк в первом), оба запроса одинаковы. Итак, почему первое, что выдает ошибку? Я не могу себе представить, что выбор форматирования имел бы значение, но, как я уже сказал, мне известно использовать ucanaccess.

Любая помощь будет оценена по достоинству. Заранее спасибо!

ответ

4

Ссылки я регулярно даю справедливо и здесь:
How to debug dynamic SQL in VBA

Вы конкатенация строки SQL без проверки его правильности.

ResultSet rs = test.executeQuery("SELECT e.* " 
           + "FROM Employees e" 
           + "WHERE e.EmployeeNo LIKE 'H%'" 
           + "ORDER BY e.LastName"); 

приведет

SELECT e.* FROM Employees eWHERE e.EmployeeNo LIKE 'H%'ORDER BY e.LastName 

Это отсутствуют пробелы между строк.

+0

Вау - вот почему я должен был отойти от программы и вернулся к ней позже. Извините за это и спасибо, показывая мне эту ошибку. +1 для ссылки тоже - очень полезно – Probius

Смежные вопросы