当使用JDBC在ApacheDerby数据库中预形成大容量插入时,我得到一个语法错误:Derby-PROPERTIES.



在尝试对大型分隔文本文件进行数据处理时,我决定使用数据库系统来完成这项工作,并提高速度。我需要我开发的程序来完成6个关键过程,以完成期望的目标。

  1. 动态创建本地数据库
  2. 创建列或类型数量未知的表
  3. 将分隔的文件导入表中(根据需要重复2和3)
  4. 预先形成SQL查询以获得所需的记录
  5. 将结果导出到另一个分隔文本文件中

我决定使用Apache的Derby数据库系统,因为它能够执行1,并且有望执行其他4。

我创建数据库:

String connectionName = "jdbc:derby:" + databaseName;
if (createDatabase) {
connectionName += ";create=true";
}
Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance();
connectionToDatabase = DriverManager.getConnection(connectionName);

这很有效,然后我从文件中获得第一条记录,并获得字段数量,以便知道需要多少列:

String statement = "CREATE TABLE " + tableName + " (";
for (int i = 1; i <= tableAmount; i++) {
statement += (char) (64 + i) + " VARCHAR(100)";
if (i != tableAmount) {
statement += ",";
}
}
PreparedStatement pstmt = connectionToDatabase.prepareStatement(statement + ")");
pstmt.executeUpdate();
connectionToDatabase.commit();

这将根据我选择的名称创建一个表(我尝试简单地创建一个名为"HELLO"的表),然后我尝试将文件导入到我制作的表中:

try {
String schemaName = "APP";
String tableName = "HELLO";
String fileName = "C:\Hello.txt";
String columnDelimiter = fieldDelimiter;
String characterDelimiter = "";
String codeset = "UTF-8";
short replace = 0;
Import.importTable(connectionToDatabase, schemaName, tableName, fileName,
columnDelimiter, characterDelimiter, codeset,
replace, false);
} catch (SQLException e) {
do {
System.out.println("SQLState:" + e.getSQLState());
System.out.println("Error Code:" + e.getErrorCode());
System.out.println("Message:" + e.getMessage());
Throwable t = e.getCause();
while (t != null) {
System.out.println("Cause:" + t);
t = t.getCause();
}
e = e.getNextException();
StackTraceElement st[] = e.getStackTrace();
for (int i = 0; i < st.length; i++) {
System.out.println("Stack Trace " + i + ":" + st[i]);
}
} while (e != null);
}catch (Exception e) {
System.err.println("Exception: " + e.getMessage());
}

但当我运行这个时,我得到的只是:

Exception: Syntax error: DERBY-PROPERTIES

我做错了什么,如果可能的话,我应该怎么做才能让它发挥作用?

编辑:它在调用Import.importTable的行出错。在修改了我的错误输出(如上)后,我现在得到以下输出:

SQLState:42X01
Error Code:30000
Message:Syntax error: DERBY-PROPERTIES.
Cause:java.sql.SQLException: Syntax error: DERBY-PROPERTIES.
Cause:ERROR 42X01: Syntax error: DERBY-PROPERTIES.
Stack Trace 0:org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source)
Stack Trace 1:org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
Stack Trace 2:org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown Source)
Stack Trace 3:org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown Source)
Stack Trace 4:org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown Source)
Stack Trace 5:org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown Source)
Stack Trace 6:org.apache.derby.impl.jdbc.EmbedPreparedStatement.<init>(Unknown Source)
Stack Trace 7:org.apache.derby.impl.jdbc.EmbedPreparedStatement20.<init>(Unknown Source)
Stack Trace 8:org.apache.derby.impl.jdbc.EmbedPreparedStatement30.<init>(Unknown Source)
Stack Trace 9:org.apache.derby.impl.jdbc.EmbedPreparedStatement40.<init>(Unknown Source)
Stack Trace 10:org.apache.derby.jdbc.Driver40.newEmbedPreparedStatement(Unknown Source)
Stack Trace 11:org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(Unknown Source)
Stack Trace 12:org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(Unknown Source)
Stack Trace 13:org.apache.derby.impl.load.Import.performImport(Unknown Source)
Stack Trace 14:org.apache.derby.impl.load.Import.importTable(Unknown Source)
Stack Trace 15:root.DatabaseManager.<init>(DatabaseManager.java:46)
Stack Trace 16:root.Startup.main(Startup.java:21)

以下是我的derby.log 的输出

Wed Nov 14 20:04:23 CST 2012:
Booting Derby version The Apache Software Foundation - Apache Derby - 10.9.1.0 - (1344872): instance a816c00e-013b-01cf-55d8-000000c58148 on database directory -omitted-  with class loader sun.misc.Launcher$AppClassLoader@1ba34f2 Loaded from file:/-omitted-/lib/derby.jar java.vendor=Sun Microsystems Inc. java.runtime.version=1.6.0_33-b05 user.dir=-omitted-
derby.system.home=null
Database Class Loader started - derby.database.classpath=''

找出问题:

  • 我使用了错误的驱动程序:我使用的是客户端驱动程序而不是嵌入式驱动程序
  • 我使用了一个不恰当的函数。它可以进行一些编辑,但正确的是

    Statement s = connectionToDatabase.createStatement();
    s.execute("CALL SYSCS_UTIL.SYSCS_IMPORT_TABLE(null,'" + tableName
    + "','" + filePath + "','" + columnDelimiter
    + "',null,null,1)");
    connectionToDatabase.commit();
    
  • 最后,最后一个问题是我使用的文本文件在最后一行没有下一行

首先,您可以从异常中获得更多信息;以下是如何:http://wiki.apache.org/db-derby/UnwindExceptionChain

其次,您应该在磁盘上找到您的"derby.log"文件;它将有更多关于哪里出了问题的信息。

第三,一旦您准确地了解了您向数据库发布的声明,以及您在代码中的何处发布了该声明,请使用该信息更新您的问题,我们可以提供更多帮助。

最新更新