执行多行查询不适用于单行查询所使用的表别名

时间:2017-01-25 21:10:38

标签: eclipse ms-access hsqldb ucanaccess

这是我第一次使用ucanaccess,因为我发现我以前的Eclipse版本不适用于Java 1.8,所以我可以访问我的Access数据库。我熟悉Java编程和RDBMS(目前使用的是Oracle),所以我不明白为什么我的代码出错了。

这是我用来连接数据库的代码(变量dbFile是一个用于存储Access数据库路径的File对象):

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

			System.out.println(); //spacing

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

对ResultSet的第一次调用(多行查询)会引发以下异常:

net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::4.0.0 user lacks privilege or object not found: E
	at net.ucanaccess.jdbc.UcanaccessStatement.executeQuery(UcanaccessStatement.java:210)
	at DBConnect.<init>(InOutBoard.java:78)
	at InOutBoard.main(InOutBoard.java:47)
Caused by: java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: E
	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: user lacks privilege or object not found: E
	at org.hsqldb.error.Error.error(Unknown Source)
	at org.hsqldb.error.Error.error(Unknown Source)
	at org.hsqldb.QuerySpecification.resolveColumnReferencesForAsterisk(Unknown Source)
	at org.hsqldb.QuerySpecification.resolveReferences(Unknown Source)
	at org.hsqldb.QueryExpression.resolve(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
Could not connect to the Database
UCAExc:::4.0.0 user lacks privilege or object not found: E

如果我运行第二次ResultSet调用(单行查询),则从表中正确返回数据。现在据我所知(除了在第一行中跨越多行),两个查询都是相同的。那么为什么第一个抛出错误呢?我无法想象格式化的选择会产生影响,但正如我所说,我知道使用ucanaccess。

任何帮助将不胜感激。提前谢谢!

1 个答案:

答案 0 :(得分: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

换行符之间缺少空格。