关于Java数据库查询结果保存到DBF的小小总结^_^

    有用到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();
        }

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值