0

我正在从 Mac OS X 开发一个使用 JDBC 驱动程序的 SQLite 数据库的 java 应用程序。

PreparedStatement该代码在 mac 上运行良好,但我不能在我的 Windows机器上使用 s 批量插入。

编辑:这也不适用于Statement包含单个INSERT INTO指令的简单 s (CREATE TABLE工作正常)。

我的代码基本上是:

表创建:

    final String sql = "CREATE VIRTUAL TABLE " + TABLE_NAME + " USING fts3("
            + KEY_NOM + ", "
            + KEY_PRENOM + ", "
            + KEY_ADRESSE + ", "
            + KEY_ADRESSE2 + ", "
            + KEY_ADRESSE3 + ");";

    try {
        final Statement s = mConnection.createStatement();
        s.execute(sql);
    } catch (final SQLException e) {
        L.e("Unable to create table: "+sql+"! "+e);
    }

PreparedStatement创建:

    String sql =
            "INSERT INTO "+TABLE_NAME
                    +" ("
                    + KEY_NOM + ", "
                    + KEY_PRENOM + ", "
                    + KEY_ADRESSE + ", "
                    + KEY_ADRESSE2 + ", "
                    + KEY_ADRESSE3 + ") "
                    + " VALUES (?, ?, ?, ?, ?)";

    mConnection.setAutoCommit(false);
    final PreparedStatement prep = mConnection.prepareStatement(sql);

然后是一个解析 CSV 文件的循环,并且在每一行调用以下代码:

        int i = 1;
        prep.setString(i++, ""+lawyer.nom);
        prep.setString(i++, ""+lawyer.prenom);
        prep.setString(i++, ""+lawyer.adresse);
        prep.setString(i++, ""+lawyer.adresse2);
        prep.setString(i++, ""+lawyer.adresse3);
        prep.addBatch();

当 CSV 文件的解析结束后,执行如下:

        final int[] res = prep.executeBatch();
        mConnection.setAutoCommit(true);
        for (int r: res) {
            if (r != 1) {
                L.e("Error adding entry!");
            }
        }

当我调用s 时mConnection.setAutoCommit(true);INSERT会在引发以下异常时执行 s 语句:

java.sql.SQLException: SQL logic error or missing database
at org.sqlite.DB.throwex(DB.java:288)
at org.sqlite.DB.exec(DB.java:68)
at org.sqlite.Conn.setAutoCommit(Conn.java:166)

测试环境:

  • MacBookAir - Mac OS 10.6 - x64 - Java 1.6.31 -工作正常(我的开发站)
  • 笔记本电脑 - Windows 7 - x64 - Java 1.6.30 -工作正常
  • MacBook - Mac OS 10.5 - x64 - Java 1.6.26 -工作正常
  • 桌面 - Windows Vista - x86 - Java 1.? -不工作
  • 服务器 - Windows Server 2003 -未知架构,猜测为 x86 - Java 1.7 -不起作用
  • 桌面 - Windows 七 - x86 - Java 1.7 -不起作用
  • 桌面 - Windows XP - x86 - Java 1.6.31 -不起作用

似乎只有 x64 主机才能使其工作。使用以下罐子:

  • swt :在 x64 主机上包含 x64 版本,在 x86 主机上包含 x86 版本
  • sqlitejdbc-v056:显然这是 x86 和 x64 兼容的
  • opencsv:这不包含本机代码
  • iText-2.1.7 和 iTextRTF:这不包含本机代码

所以也许 JDBC SQLite 驱动程序不完全兼容 x86。我会尝试进行更多调查。

4

1 回答 1

2

TL;DR
我的 SQLite JDBC 驱动程序使用的是本机代码,并且与 32 位处理器不完全兼容。

两个可能的修复:

  • 使用Xerial,一个在 Mac OS X 64 位和 Windows 32 位上都能正常工作的原生 SQLite JDBC 驱动程序
  • 使用纯 java 实现以性能为代价解决了该问题。

说明

在过去的 3 天里,我一直用 SQLite 异常表示“SQL 逻辑错误或缺少数据库”。我不会评论包含两个可能的不同错误的异常文本,而不会说明可能是哪个原因。我也不会评论异常文本中提到的两个错误都不是问题的原因。

事实:

  • SQLite 异常说明“ SQL 逻辑错误或缺少数据库
  • 使用jsqlitejdbc v056
  • 驱动程序能够创建表
  • 驾驶员能够从表格中选择信息
  • 数据库文件没有损坏,即。可以使用 sqlite 客户端打开它并将数据插入到表中
  • 驱动程序无法将数据插入表中

解决我的问题是替换sqlitejdbc-v056.jar包含sqlitejdbc-v056-pure.jar纯 Java 实现的本机代码。

我希望所有遇到此问题的用户都能够快速看到这一点,而不是为此浪费 3 天。

于 2012-06-06T08:32:37.230 回答