前面的博文中提到過項目中有解析dbf數據文件作導入的需求,因爲項目中用到的DBF文件由FoxPro產生,本文的重點也圍繞FoxPro的DBF文件展開。 java
其實網上有至關多的java工具,用於解析dbf文件,嘗試了不少,效果都不太理想,主要問題出如今亂碼問題、解析不到數據,因爲我的沒也時間去研究源碼,其實也比較頭疼byte的操做,說到底仍是寄但願有個第三方的解析工具。最後讓我發現了jdbc-odbc,嘗試以後,發現不只從代碼的編寫的容易程度仍是到數據的解析出錯問題都至關的完美,惟一的限制,利用jdbc-odbc解析FoxPro的dbf文件,須要安裝微軟提供的驅動,編程環境限於window。 sql
因爲此次作得是導入,代碼的重點也放在讀上: 編程
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不支持上傳附件。有須要的同窗上網上下載或者找我都行。 工具