我正在从 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。我会尝试进行更多调查。