JDBC ドライバーを使用して SQLite データベースを使用する Java アプリケーションを Mac OS X から開発しています。
このコードは Mac では問題なくPreparedStatement
動作しますが、Windows ボックスで s を使用してバッチ挿入を使用することはできません。
Statement
EDIT:これは、単一の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 と完全には互換性がない可能性があります。もっと調べてみます。