Java连接查询Paradox数据库*.DB文件

Paradox数据库是一个关系型数据库,现在看来它已经非常的古老了,而且在这之前没有听说过,但依然还有一些现行的系统中使用它,而且早期Delphi的程序用它比较多,好了这个关系先不深究了。现在客户给的数据库文件需要导入到我们的系统中,我们采用的策略是上传数据库文件,通过程序来连接读取该文件。数据库文件扩展名为.DB,乍一看让我想到了sqlite,但是通过花费一些时间查找以及验证,才终于确定,原来它是Paradox数据库文件。其实确定.DB文件是Paradox数据库的过程以及寻找驱动才是最花时间的。如果你缺的也是这些,直接到文末提供的链接下载吧。

工具资源

说下我们可以用到的工具,如果想查看DB文件的内容,那两个打开Paradox数据库文件的客户端工具可以使用:
1. Paradox Data Editor
2. ParadoxDBViewer

方法一:使用Paradox_JDBC30.jar来连接

Paradox_JDBC30.jar很强大,但这个驱动包是收费的。官网提供了一个试用版本,试用版的限制是在一个进程内不能连接查询超过50次,否则会抛超出查询次数的自定义Exception。下载 Java连接Paradox数据库文件的Jar包,也就是我们要用的驱动,文末提供了下载地址。

来看看我们的一个简单的DEMO,再重新温习下jdbc的东西。
首先我们根据业务定义了一个类型:

public class FltLegBean {
	String planeMdl;
	String fltNum;
	String schedule;
	String takeOffApt;
	String deskOnApt;
	String std;
	String sta;
	String startDate;
	String endDate;
	String remark;
	//此处省略了get,set方法以及重写的toString方法。
}

接下来通过一个主函数调用下面的方法就可以了,其中最主要的是连接串及驱动,D:\DB 是我们存放数据库文件的目录。
重点:这个目录相当于一个数据库,每一个*.DB文件实际上是数据库中的一张表。
如果我们的文件名为“华北局.DB”,那我们要Select的表名就是华北局。

/**
 * 连接Paradox数据库文件并打印数据
 */
private static void readDBFile() {
	String driver = "com.hxtt.sql.paradox.ParadoxDriver";
	String url = "jdbc:paradox:/D:\\DB";
	try {
		Class.forName(driver);
		Connection con = DriverManager.getConnection(url);
		String sql = "select * from 华北局";
		PreparedStatement pstmt;
		try {
			pstmt = (PreparedStatement) con.prepareStatement(sql);
			ResultSet rs = pstmt.executeQuery();
			List<FltLegBean> legList = new ArrayList<FltLegBean>();
			FltLegBean entity = new FltLegBean();
			while (rs.next()) {
				entity.setPlaneMdl(rs.getString(2));
				entity.setFltNum(rs.getString(12));
				entity.setSchedule(rs.getString(5));
				entity.setTakeOffApt(rs.getString(13));
				entity.setDeskOnApt(rs.getString(17));
				entity.setStd(rs.getString(14));
				entity.setSta(rs.getString(15));
				entity.setStartDate(rs.getString(45));
				entity.setEndDate(rs.getString(46));
				entity.setRemark(rs.getString(55));
				legList.add(entity);
			}

			// 获取列名
			ResultSetMetaData data = rs.getMetaData();
			for (int i = 1; i <= data.getColumnCount(); i++) {
				System.out.println(data.getColumnName(i) + "\t" + data.getColumnTypeName(i) + "\t"
						+ data.getColumnDisplaySize(i));
			}

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

			// 打印数据
			for (FltLegBean model : legList) {
				System.out.println(model.toString());
			}

		} catch (SQLException e) {
			e.printStackTrace();
		}
	} catch (Exception ex) {
		System.out.println(ex);
	}
}

注:当然了在运行之前记得引入驱动jar包。

其实连接很简单,和我们jdbc连接其他数据库一样。最花时间的是确定文件是Paradox数据库,以及找到打开他的工具及jar包。
最后附上相关的工具地址。

方法二:利用GitHub开源项目

GitHub上有很多这样的项目,如
1. teverett/paradoxReader
2. gythialy/paradoxdriver
3. robinvanemden/PdxReader
这些项目都可以连接DB文件,但因为都是国外项目,这里面常遇到的问题就是中文乱码以及日期,时间格式的处理问题。

三个项目都会遇到中文乱码的问题,以PdxReader为例:
1. 如:PdxReader 是直接将每一个byte 转为了chartableStringBuffer.append((char) intBuffer[k]);,而我们则需要将byte[]整体转为Stringnew String(intBuffer,Charset.forName("GBK"));来解决乱码问题。
2. 日期的处理也都需要稍作调整,PdxReader解析出来的Date以及Timestamp类型的结果类似于这样:4813484952113119232,而这并不是我们常用的时间戳的长度,因此就需要结合另外两个项目来修改这里。

当然这里我只是重点测试了用到的几种常见类型发现了问题。后面我采用了 paradoxdriver 的方案并参考了其他两个项目互补来解决遇到的一些不兼容中文以及类型的问题。

因此虽说Paradox古老,但是依然有老的项目在使用它,那我们就不得不正视它,并解决它。

参考资料:

  1. HXTT Paradox Pure Java JDBC (1.2, 2.0, 3.0, 4.0, 4.1, 4.2) Drivers for Corel Paradox
  2. BDE数据库编辑器Paradox Data Editor 3.3
  3. Paradox数据库浏览工具官方下载V1.0官方版
  4. robinvanemden/PdxReader
  5. gythialy/paradoxdriver
  6. teverett/paradoxReader

发表评论

电子邮件地址不会被公开。 必填项已用*标注