如何使用jackcess将数据从数组传递到数据库

时间:2014-02-18 00:56:06

标签: java arrays ms-access gridview jackcess

您好基本上我这样做是为了从数据库检索数据到数组

 for(i=0;i<numfilas;i++){
    HashMap<Object, Object> rowdata = new HashMap<Object, Object>(cur.getNextRow());
    for(j=0;j<numcolumnas;j++){
        datos[posicion]=rowdata.get(nombrecolumnas[j]).toString();
        posicion++;
    }
    }

然后我将数据传递给EditTexts以便用户可以编辑它,然后我更新数组,问题是如何获取这些数据并将其发送回数据库?

我遇到数据类型问题吗?因为数组是String类型,数据库有int Type,String Type,long type .....

提前致谢

1 个答案:

答案 0 :(得分:2)

  

我遇到数据类型问题吗?因为数组是String类型,数据库有int Type,String Type,long type .....

如果您尝试更新的任何字段是Access中的Date/Time字段,则可能是。 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。它是一个纯Java JDBC驱动程序,它使用Jackcess在Access数据库上执行读写操作,但允许您使用更多&#34; normal&#34;像这样的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();