关于Java数据库查询结果保存到DBF的小小总结^_^
2015-08-11 09:07
417 查看
有用到JAVADBF包,但是有许多不适合的地方。自己有修改,先码这,下次看起来方便点。。。 `这里写代码片`另,DBF文件格式需了解。如,0x0D结束文件头,每行字段值以0x20开头,文件以0x1A结尾等等。
大致:
准备好列数、行数、每个字段长度,字段名以及字段类型
rs = stmt.executeQuery(sql); // 获得ResultSet的总行数 rs.last(); rowCount = rs.getRow(); rs.beforeFirst(); // 表的列数 ResultSetMetaData rsmd = rs.getMetaData(); columnCount = rsmd.getColumnCount(); columnName = new String[columnCount]; fieldLength = new int[columnCount]; columnData = new Object[columnCount]; columnType = new String[columnCount]; System.out.println(rowCount); System.out.println(columnCount); for (int i = 1; i <= columnCount; i++) { // 字段名 columnName[i-1] = rsmd.getColumnName(i); // 字段长度 fieldLength[i-1] = rsmd.getColumnDisplaySize(i);// *2?? // rsmd.getColumnType(i); //字段类型 columnType[i-1] = rsmd.getColumnTypeName(i); //test System.out.println(columnType[i-1]+"::"+fieldLength[i-1]); } MyUtils.writeDBF_Declar(filename+".DBF", columnCount,rowCount, fieldLength, columnName, columnType);//写文件头 while (rs.next()) { for (int i = 1; i <= columnCount; i++) { // 字段数据 columnData[i-1] = rs.getObject(i); } MyUtils.writeDBF_Data(filename+".DBF", columnCount, fieldLength, columnName, columnType, columnData);//一行一行写入数据 } MyUtils.writeEnd();//结尾
架包以及其源码网上都可以找到,只是他是把数据一次性写入。若想从数据库里一行一行写入需稍作修改。另,其字段类型也是一个麻烦的问题。数据只支持Double。integer,float都报错,需转。 还有些小问题,如“BS”字段长度为1,Utils.textPadding(……)操作成0了,所以会有空白问题……先到这,具体问题只能继续断点跟踪了。。。
public static void writeDBF_Declar(String path, int columnCount,int rowCount, int[] fieldLength, String[] columnName, String[] columnType) { try { // 定义DBF文件字段 DBFField[] fields = new DBFField[columnCount]; for (int i = 0; i < columnCount; i++) { fields[i] = new DBFField(); fields[i].setName(columnName[i]); fields[i].setFieldLength(fieldLength[i]); //fields[i].setFieldLength(10); if (columnType[i].contains("CHAR") || columnType[i].contains("CLOB")) { fields[i].setDataType(DBFField.FIELD_TYPE_C); }else if (columnType[i].contains("DATE")) { fields[i].setDataType(DBFField.FIELD_TYPE_D); } else if (columnType[i].contains("NUMBER") || columnType[i].contains("INT") || columnType[i].contains("DECIMAL") || columnType[i].contains("REAL")) { fields[i].setDataType(DBFField.FIELD_TYPE_N); } else if(columnType[i].contains("FLOAT")){ fields[i].setDataType(DBFField.FIELD_TYPE_N); fields[i].setDecimalCount(2); }else { fields[i].setDataType(DBFField.FIELD_TYPE_M); } } writer = new DBFWriter(path); // 把字段信息写入DBFWriter实例,即定义表结构 writer.setFields(fields,rowCount); } catch (Exception e) { e.printStackTrace(); } }
public static void writeDBF_Data(String path, int columnCount, int[] fieldLength, String[] columnName, String[] columnType, Object[] columnData) throws Exception { Object[] rowData = null; rowData = new Object[columnCount]; for (int i = 0; i < columnCount; i++) { if((columnData[i]!=null)&&columnType[i].equalsIgnoreCase("int")){ int a = new Integer((Integer) columnData[i]); double temp = a; rowData[i] = temp; }else if((columnData[i]!=null)&&columnType[i].equalsIgnoreCase("float")){ float a = new Float((Float) columnData[i]); double temp = a; rowData[i] = temp; }else if((columnData[i]!=null)&&columnType[i].equalsIgnoreCase("date")){ Date a = new Date(0); a = (Date) columnData[i]; rowData[i] = a; }else{ rowData[i] = columnData[i]; } } writer.addRecord(rowData); // 写入数据 writer.write(); } public static void writeEnd(){ try { writer.writeEnd(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android之获取手机上的图片和视频缩略图thumbnails
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- SQL中的三值逻辑
- 插入排序
- 冒泡排序