前面的博文中提到过项目中有解析dbf数据文件做导入的需求,由于项目中用到的DBF文件由FoxPro产生,本文的重点也围绕FoxPro的DBF文件展开。

其实网上有相当多的java工具,用于解析dbf文件,尝试了很多,效果都不太理想,主要问题出现在乱码问题、解析不到数据,由于个人没也时间去研究源码,其实也比较头疼byte的操作,说到底还是寄希望有个第三方的解析工具。最后让我发现了jdbc-odbc,尝试之后,发现不仅从代码的编写的容易程度还是到数据的解析出错问题都相当的完美,唯一的限制,利用jdbc-odbc解析FoxPro的dbf文件,需要安装微软提供的驱动,编程环境限于window。

由于这次做得是导入,代码的重点也放在读上:

package com.excellence.dbf.javadbf;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.ResultSetMetaData;

import java.sql.SQLException;

public class DBFJdbcOdbcTest {

public static void main(String[] args) {

Connection conn = null;

PreparedStatement pstm = null;

ResultSet rs = null;

//下面的代码其实都是基本的jdbc代码,所以编写上面基本没什么问题

String DB_URL =

"jdbc:odbc:Driver={Microsoft FoxPro VFP Driver (*.dbf)};" + //写法相对固定

"UID=;"+

"Deleted=Yes;"+

"Null=Yes;"+

"Collate=Machine;"+

"BackgroundFetch=Yes;"+

"Exclusive=No;"+

"SourceType=DBF;"+ //此处指定解析文件的后缀

"SourceDB=E:\\users\\pengsy\\DBF\\data\\main"; //此处为dbf文件所在的目录

try {

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

try {

conn = DriverManager.getConnection(DB_URL);

pstm = conn.prepareStatement("select * from XXB"); // 此处的XXB 为DBF数据文件的名字

rs = pstm.executeQuery();

ResultSetMetaData metaData = pstm.getMetaData();

//展示dbf元数据信息

System.out.println("metaData.getColumnCount():"+metaData.getColumnCount());

System.out.println("**************************");

for(int i = 1 ; i <= metaData.getColumnCount() ; i++){

System.out.println("metaData.getCatalogName:"+metaData.getCatalogName(i));

System.out.println("metaData.getColumnClassName:"+metaData.getColumnClassName(i));

System.out.println("metaData.getColumnDisplaySize:"+metaData.getColumnDisplaySize(i));

System.out.println("metaData.getColumnLabel:"+metaData.getColumnLabel(i));

System.out.println("metaData.getColumnName:"+metaData.getColumnName(i));

System.out.println("metaData.getColumnType:"+metaData.getColumnType(i));

System.out.println("metaData.getColumnTypeName:"+metaData.getColumnTypeName(i));

System.out.println("metaData.getPrecision:"+metaData.getPrecision(i));

System.out.println("metaData.getScale:"+metaData.getScale(i));

System.out.println("metaData.getSchemaName:"+metaData.getSchemaName(i));

System.out.println("metaData.getTableName:"+metaData.getTableName(i));

System.out.println("**************************");

}

//展示dbf中的行数据

while(rs.next()){

for(int i = 1 ; i <= metaData.getColumnCount() ; i++){

System.out.println(rs.getString(i));

}

System.out.println("*******************************************");

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally{

if(rs != null){

rs.close();

}

if(pstm != null){

pstm.close();

}

if(conn != null){

conn.close();

}

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

至于FoxPro用到的驱动,这里没法提供了,oschina不支持上传附件。有需要的同学上网上下载或者找我都行。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐