用java实现把sql语句查询的结果集写到dbf文件中

来源:互联网 发布:华为交换机 允许mac表 编辑:程序博客网 时间:2024/06/06 02:53

这个其实就是一个导出生成DBF文件的功能,实现思路是这样:首先动态拼接一个sql语句,执行后返回结果集到代码中,再通过dbfwriter对象把结果集的数据写到dbf文件里。

1、打开数据库连接,执行sql语句,获得结果集

private Connection bakConn;private ResultSet RowSet = null;private Statement stats = null;private String formate = "yyyyMMdd";@Overridepublic 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块中按顺序释放资源


阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 掉了一颗虎牙,怎么办 牙里面掉了一块怎么办 u盘坏了无法识别怎么办 u盘内容读不出来怎么办 u盘文件读不出来怎么办 u盘突然读不出来怎么办 u盘读取不出来怎么办 蛋糕卷底部粘纸怎么办 美瞳没有护理液怎么办 没有带护理液了怎么办 护理液忘记带了怎么办 康宁玻璃锅裂了怎么办 带隐形牙套喝酒怎么办 牙齿保持器丢了怎么办 牙套保持器坏了怎么办 牙齿磕掉了一小块怎么办 牙齿裂掉了一半怎么办 大牙缺了一小块怎么办 牙根碎了一小块怎么办 门牙碎了一小块怎么办 孩子门牙长歪了怎么办 儿童门牙长歪了怎么办 大门牙长歪了怎么办 下面牙齿长歪了怎么办 只有一颗牙齿歪怎么办 牙齿突然长歪了怎么办 有个牙齿长歪了怎么办 一颗大牙长歪了怎么办 一颗牙齿长偏了怎么办 一个门牙长歪了怎么办 儿童牙齿长歪了怎么办 孩子牙齿长歪了怎么办 宝宝门牙长歪了怎么办 一颗牙齿挤歪了怎么办 后槽牙掉了一块怎么办 最里面的牙掉了怎么办 成年了牙齿掉了怎么办 我的门牙豁牙子怎么办 小孩牙齿长得稀怎么办 后槽牙掉了一颗怎么办 前门牙掉了一颗怎么办