0

JDBC ドライバーを使用して SQLite データベースを使用する Java アプリケーションを Mac OS X から開発しています。

このコードは Mac では問題なくPreparedStatement動作しますが、Windows ボックスで s を使用してバッチ挿入を使用することはできません。

StatementEDIT:これは、単一の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!");
            }
        }

を呼び出すと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 Seven - x86 - Java 1.7 -動作しない
  • デスクトップ - Windows XP - x86 - Java 1.6.31 -動作しない

これを機能させることができるのは x64 ホストだけのようです。次の jar が使用されます。

  • swt : x64 ホストには x64 バージョン、x86 ホストには x86 バージョンが含まれています
  • sqlitejdbc-v056 : どうやらこれは x86 および x64 と互換性があります
  • opencsv : これにはネイティブ コードは含まれません
  • iText-2.1.7 および iTextRTF: ネイティブ コードは含まれません

そのため、JDBC SQLite ドライバーは x86 と完全には互換性がない可能性があります。もっと調べてみます。

4

1 に答える 1