您的位置:首页 > 编程语言 > Java开发

关于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();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sql 数据库 java