【问题标题】:Error statment creation N tables DBUnit + HsqlDb (v. 2.3.2)错误语句创建 N 个表 DBUnit + HsqlDb (v. 2.3.2)
【发布时间】:2015-05-06 17:35:27
【问题描述】:

我正在使用DBUnit + hsqlDB 进行数据库单元测试。到目前为止,我们使用的是 hsqldb 版本 1.8.0.10。

  <dependency>
      <groupId>org.hsqldb</groupId>
      <artifactId>hsqldb</artifactId>
      <version>1.8.0.10</version>
      <scope>test</scope>
   </dependency>

我们有一些脚本来创建数据库架构(创建多个表)。我们通过PreparedStatement 加载并执行这些脚本。基本上是这样的:

   @Test
   public void testMultipleTablesError() throws Exception {
      IDatabaseTester databaseTester = new JdbcDatabaseTester("org.hsqldb.jdbcDriver", "jdbc:hsqldb:mem:test");
      Connection connection = databaseTester.getConnection().getConnection();
      try {
         String scriptDDL = "CREATE TABLE TABLE_A(A  VARCHAR(10)); CREATE TABLE TABLE_B(B  VARCHAR(10))";
         PreparedStatement preparedStatement = connection.prepareStatement(scriptDDL);
         preparedStatement.execute();
      } catch (Exception ex) {
         ex.printStackTrace();
      } finally {
         try {
            connection.close();
         } catch (Exception ex) {
            ex.printStackTrace();
         }
      }
   }

这适用于 1.8.0.10。但是如果我们更改为hsqldb 版本2.3.2,我们会在准备语句时遇到异常:

   <dependency>
      <groupId>org.hsqldb</groupId>
      <artifactId>hsqldb</artifactId>
      <version>2.3.2</version>
      <scope>test</scope>
   </dependency>

Caused by: org.hsqldb.HsqlException: palabra no esperado: CREATE
    at org.hsqldb.error.Error.parseError(Unknown Source)
    at org.hsqldb.ParserBase.unexpectedToken(Unknown Source)
    at org.hsqldb.ParserCommand.compileStatement(Unknown Source)

如果我们更改脚本只创建一个表,它在两个版本中都可以正常工作:

String scriptDDL = "CREATE TABLE TABLE_A(A  VARCHAR(10))";

谁知道创建多个表的语法是否在版本之间发生了变化?

提前感谢您的帮助

编辑DBUnit 版本:

   <dependency>
      <groupId>org.dbunit</groupId>
      <artifactId>dbunit</artifactId>
      <version>2.5.0</version>
      <scope>test</scope>
   </dependency>

【问题讨论】:

    标签: testing jdbc hsqldb dbunit


    【解决方案1】:

    在 HSQLDB 1.8.0 中有效的 CREATE TABLE 语句仍然有效。更改与 prepareStatement() 方法有关,现在它只接受单个 SQL 语句。您仍然可以将createStatement()Statement.execute(script) 与多个SQL 语句一起使用。

    【讨论】:

    • 非常感谢!我想当然地认为问题出在 hsqldb 版本上,我的错!正如你所说,我已经改变了声明,它工作正常。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多