问题
之前介绍了使用javadbf工具包读写dbf的方法,基本可以实现大多数读写dbf的应用场景。
但如果你生成的dbf文件包含了特殊字段,比如下图的字段“_NULLFLAGS”,字段类型是Bytes,此类型在javadbf工具包中是不支持的。
当你使用javadbf来写入该文件时,是无法用bytes类型写入该字段值或无法在新增记录行保留原bytes类型,这将可能导致你的硬件设备比如抄表机等无法正确识别读取该文件。
解决方案
使用dbf-jdbc-wisecoders工具包。
使用工具包前,需要先在项目中导入dbschema-dbf-jdbc1.0.jar包,同时还有另外两个包h2-2.1.212.jar、javadbf-1.13.2.jar也一并导入。
dbf-jdbc-wisecoders工具类下载地址
以下为使用示例代码
public void writeDbfZZD2() {
try {
//引入类,该类需要在工程中导入包 dbschema-dbf-jdbc1.0.jar
Class.forName("com.wisecoders.dbschema.dbf.JdbcDriver");
//dbf原文件所在目录,后面的?charset=GBK是避免中文乱码
String url = "jdbc:dbschema:dbf:/D:/mywork/myWorkSpace/dbf?charset=GBK";
Connection con = DriverManager.getConnection(url, "", "");
//新增记录行
String sql = "insert into A(HM, SBBH, DZ, CCBH, DH,XH,YE) values (?, ?, ?, ?, ?, ?, ?)";
PreparedStatement stmt = con.prepareStatement(sql);
stmt.setMaxRows(500);
stmt.setFetchSize(20);
stmt.setString(1, new Time(new Date().getTime()).toString());
stmt.setString(2, "test2022-09-01");
stmt.setString(3, "test2022-09-02");
stmt.setString(4, "test2022-09-03");
stmt.setString(5, "test");
stmt.setInt(6, 0);
stmt.setInt(7, 300);
stmt.execute();//执行sql语句
stmt.close();
Statement st = con.createStatement();
//保存文件 此步骤执行后,数据才会保存到dbf文件中
st.execute("save dbf to D:/mywork/myWorkSpace/dbf");
st.close();
con.close();
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
执行以上方法后,指定目录下的dbf文件A.dbf会新增一条新数据,若原文件包含bytes字段,也会自动保留此类型。