データ型に問題がありますか? 配列がString型で、データベースがint型、String型、long型だったので.....
更新しようとしているフィールドのいずれかがDate/Time
Access のフィールドである場合、可能性があります。Jackcess は暗黙のうちに文字列を数値にキャストできますが (多くの場合、とにかく)、日付に関してはそれができません。
[Members] という名前のテーブルのサンプル データの場合
MemberID MemberName SponsorID DateJoined FeePaid
-------- ---------- --------- ---------- -------
1 Gord 2014-01-16 0
次のコードは正常に動作します
try (Database db = DatabaseBuilder.open(new File("C:/Users/Public/mdbTest.mdb"))) {
Table table = db.getTable("Members");
Row row = CursorBuilder.findRow(table, Collections.singletonMap("MemberID", 1));
if (row != null) {
row.put("SponsorID", "0"); // "Long Integer" in Access
row.put("FeePaid", "130"); // "Currency" in Access
table.updateRow(row);
}
else {
System.out.println("row not found.");
}
} catch (Exception e) {
e.printStackTrace(System.out);
}
ただし、これは機能しません
row.put("DateJoined", "2014-01-23"); // "Date/Time" in Access
Jackcess は文字列値を内部 (数値) 日付値に暗黙的にキャストできないため、代わりに次のようなことを行う必要があります。
org.joda.time.DateTime dt = new org.joda.time.DateTime("2014-01-23");
row.put("DateJoined", dt.getMillis());
別の方法として、 UCanAccessを調査することもできます。これは、Jackcess を使用して Access データベースで読み取りと書き込みを実行する純粋な Java JDBC ドライバーですが、次のようなより「通常の」SQL メソッドを使用して実行できます。
Connection conn=DriverManager.getConnection(
"jdbc:ucanaccess://C:/Users/Public/mdbTest.mdb");
PreparedStatement ps = conn.prepareStatement(
"UPDATE Members SET " +
"SponsorID=?, " +
"DateJoined=?, " +
"FeePaid=? " +
"WHERE MemberID=1");
ps.setInt(1, Integer.parseInt("0"));
org.joda.time.DateTime dt = new org.joda.time.DateTime("2014-01-23");
ps.setTimestamp(2, new Timestamp(dt.getMillis()));
ps.setBigDecimal(3, new BigDecimal("130"));
ps.executeUpdate();