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

版权声明:本文为博主原创文章,未经博主允许不得转载。 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块中按顺序释放资源


猜你喜欢

转载自blog.csdn.net/u013703363/article/details/78548195