如何通过Java从MS Access 2007数据库中读取Unicode字符?

在Java中,我编写了一个读取UTF8文本文件的程序.该文本文件包含SELECT类型的SQL查询.然后,程序在Microsoft Access 2007数据库上执行查询,并将第一行的所有字段写入UTF8文本文件.我遇到的问题是返回包含unicode字符的...

在Java中,我编写了一个读取UTF8文本文件的程序.该文本文件包含SELECT类型的SQL查询.然后,程序在Microsoft Access 2007数据库上执行查询,并将第一行的所有字段写入UTF8文本文件.

我遇到的问题是返回包含unicode字符的行,例如“?”.这些字符显示为“?”在文本文件中.

我知道正确读取和写入文本文件,因为从包含SQL查询的文本文件中读取了一个虚拟UTF8字符(“◎”),并将其写入包含结果行的文本文件中.在记事本中打开书写文本文件时,UTF8字符看起来正确,因此文本文件的读取和写入不是问题的一部分.

这是我连接数据库以及如何执行SQL查询的方式:

Connection c = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:/database.accdb;Pwd=temp");

ResultSet r = c.createStatement().executeQuery(sql);

我已经尝试为Connection创建一个charSet属性,但它没有区别:

Properties p = new Properties();
p.put("charSet", "utf-8");
p.put("lc_ctype", "utf-8");
p.put("encoding", "utf-8");
Connection c = DriverManager.getConnection("...", p);

试过“utf8”/“UTF8”/“UTF-8”,没有区别.如果我输入“UTF-16”,我会得到以下异常:

java.lang.IllegalArgumentException: Illegal replacement

一直在寻找没有结果的几个小时,现在把我的希望转向你.请帮忙!

我也接受解决方法的建议. =)我想要做的是创建一个Unicode查询(例如,搜索包含“あ”字符的帖子的查询),并获得正确接收并保存Unicode字符的结果.

谢谢!

更新.以下是该问题的一个独立示例:

package test;
import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.nio.charset.Charset;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.util.Properties;
public class Standalone {
    public static void main(String[] args) {
        try {
            Properties p = new Properties();
            p.put("charSet", "UTF8");
            Connection c = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=./dummy.accdb;Pwd=pass", p);
            ResultSet r = c.createStatement().executeQuery("SELECT TOP 1 * FROM main;");
            r.next();
            OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(new File("results.txt")), Charset.forName("UTF-8"));
            osw.write(new BufferedReader(new InputStreamReader(new FileInputStream("utf8.txt"), Charset.forName("UTF-8"))).readLine() +" : "+ r.getString("content"));
            osw.close();
            c.close();
            System.out.println("Done.");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

该示例的作用是打开使用密码“pass”加密的数据库“dummy.accdb”,并从表“main”中拉出第一个帖子.然后它读取文本文件“utf8.txt”并写入一个文本文件“results.txt”,它将包含第一行“utf8.txt”加上它从数据库中获取的字段“content”的值.

在文件“utf8.txt”中,我存储了“??????????????????”.
在数据库的“主”表的“内容”字段中,我存储了“??あキタ?????♀♂?♀♂”.

在应用程序运行完毕后,“results.txt”具有以下内容:“??????????????????:??????????????”.

它成功读取和写入“utf8.txt”文本文件的UTF8字符,但无法从数据库中获取正确的字符.这就是问题所在.

更新.我想我应该提到数据库中的字段是“memo”类型,我已经尝试过havig“Unicode Compression”设置为“No”和“Yes”(重新尝试之间的帖子以确保没有压缩存在当选择“否”时).据我所知,Access在保存Unicode字符时使用UTF-16,但是对其进行压缩会更改为UTF-8.无论如何,这没有任何区别.

奖金问题,任何人都知道如何使用Java中的纯ODBC提供程序连接到数据库?还是其他任何一种方法?这将为我提供一个很好的解决方法.

更新.我一直在尝试将这四个提供给getConnection:

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=./dummy.accdb"
"jdbc:odbc:Provider=Microsoft.Jet.OLEDB.4.0;Data Source=./dummy.accdb"
"jdbc:odbc:Driver={Microsoft.Jet.OLEDB.4.0};Data Source=./dummy.accdb"
"jdbc:odbc:Provider=Microsoft.ACE.OLEDB.12.0;Data Source=./dummy.accdb"

第一个给出错误“java.sql.SQLException:没有为Provider发现合适的驱动程序= Microsoft.Jet.OLEDB.4.0;数据源=./ dummy.accdb”,中间的两个得到“java.sql.SQLException: [Microsoft] [ODBC驱动程序管理器]未找到数据源名称且未指定默认驱动程序“.最后一个获取“java.sql.SQLException:[Microsoft] [ODBC驱动程序管理器]数据源名称太长”.

我不明白getConnection想要什么.参数说明如下:“url – jdbc:subprotocol:subname形式的数据库URL”.咦?我显然不明白这意味着什么.

有人知道通过Java连接到Access 2007数据库的任何其他工作方式吗?也许我尝试的提供商不受支持,但其他一些可能?

解决方法:

由于您提到切换到除Access之外的其他DB,我建议您这样做.在Microsoft Office产品上制作软件一直是我的维护噩梦,因此请从此列表中选择其他任何内容:http://java-source.net/open-source/database-engines.

我会选择Apache Derby,或者只使用预先安装了当前Sun Java安装的Java Database JavaDB(实际上是一个重新打包的Derby DB)

本文标题为:如何通过Java从MS Access 2007数据库中读取Unicode字符?

基础教程推荐