版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013703363/article/details/78548195
这个其实就是一个导出生成DBF文件的功能,实现思路是这样:首先动态拼接一个sql语句,执行后返回结果集到代码中,再通过dbfwriter对象把结果集的数据写到dbf文件里。
1、打开数据库连接,执行sql语句,获得结果集
private Connection bakConn;
private ResultSet RowSet = null;
private Statement stats = null;
private String formate = "yyyyMMdd";
@Override
public void run() {
try {
bakConn = DatabaseConn.getConnection();
} catch (Exception e1) {
e1.printStackTrace();
}
String sql = "select * from tablename";
stats = bakConn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
RowSet = stats.executeQuery(sql);
RowSet.beforeFirst();
2、定义需要写到dbf的字段名,类型,长度,定义dbf文件的字段名,类型(从结果集中的数据库类型对应转换过来)
String[] strutName = new String[] {...} // field name
String[] rsTypejc = new String[] {...} // field type
int[] strutLength2 = new int[] { ...} // field length
/**
* 把数据库字段类型转换成DBF字段类型
*/
public static byte ResultsetTypeToDbfType(String rsType) {
byte strutType = DBFField.FIELD_TYPE_C;
if (rsType == null) {
return DBFField.FIELD_TYPE_C;
}
rsType = rsType.trim().toLowerCase();
if (rsType.equals("float") || rsType.equals("int")
|| rsType.equals("numeric") || rsType.equals("decimal")
|| rsType.equals("smallint") || rsType.equals("tinyint")) {// rsType.equals("bigint")
// ||
strutType = DBFField.FIELD_TYPE_N;
} else if (rsType.equals("datetime") || rsType.equals("smalldatetime")) {
strutType = DBFField.FIELD_TYPE_C;
} else if (rsType.equals("bit")) {
strutType = DBFField.FIELD_TYPE_L;
} else {
strutType = DBFField.FIELD_TYPE_C;
}
return strutType;
}
上面是把数据库类型转为dbf类型。
下面是具体的dbf写操作:
填充field,填入转换后类型等等,把结果集rowset里的数据逐条遍历,把数据放进writer里
// 定义dbf对象
DBFField[] fields = new DBFField[strutName.length];
System.out.println(fields);
byte[] strutTypejc = new byte[strutName.length];
for (int i = 0; i < strutName.length; i++) {
fields[i] = new DBFField();
fields[i].setName(strutName[i]);
strutTypejc[i] = ResultsetTypeToDbfType(rsTypejc[i]);
fields[i].setDataType(strutTypejc[i]);
fields[i].setFieldLength(strutLength[i]);
}
DBFWriter writer = new DBFWriter();
System.out.println(fields);
writer.setFields(fields);
writer.setCharactersetName("GBK");
// 一条条的写入记录
Object[] rowData = new Object[strutName.length];
RowSet.last();
RowSet.beforeFirst();
while (RowSet.next()) {
rowData = ResultsetToArrayJCTP(RowSet, rowData, "jc",
strutName, rsTypejc);
if (rowData != null) {
writer.addRecord(rowData);
}
}
// 把装了文件的输出流放到writer里
writer.write(fos);
这里注意:fos是文件输出流,具体处理在下面
file = new File("C:" + File.separator + "xxx"
+ File.separator + "001" );
if (file.isFile()) {
file.delete();
}
OutputStream fos = null;
// 定义输出流,并关联的一个文件
try {
// 把文件放到输出流
fos = new FileOutputStream(file);
} catch (FileNotFoundException e2) {
e2.printStackTrace();
}
dbf对象的writer通过文件流来操作文件,不是直接写入文件,如下:
writer = new DBFWriter(file);
writer.write();
这种做法是不正确的,会导致文件无法及时释放,直至整个应用关闭才可释放。
最后是资源的释放:
finally { // 按顺序释放资源
// 关闭连接
try {
// 流关闭
fos.close();
// 关闭结果集
if (this.getRowSet() != null) {
this.getRowSet().close();
this.setRowSet(null);
}
if (this.getStats() != null) { // 关闭语句
this.getStats().close();
this.setStats(null);
}
if (this.getBakConn() != null) { // 关闭连接
this.getBakConn().close();
this.setBakConn(null);
}
} catch (Exception e1) {
e1.printStackTrace();
}
}
在finally块中按顺序释放资源