2014-02-21 53 views
1

我正在尝试制作连接到Access数据库的应用程序。我已经通过使用.mdb文件创建了我的Java程序的ODBC连接,但是我在Unicode字符中遇到了这个问题。如果记录是用英文(拉丁)字符编写的,那么.mdb文件会识别这些字符,但是如果记录是用希腊语写的,那么会出现一些奇怪的字符,并且我无法使用ResultSet对象获取记录。有人可以帮忙吗?Java ODBC MS-Access Unicode字符问题

+0

有些dbs对于非ascii数据有不同的数据类型。 Java字符串是Unicode的设计 – Leo

+0

问题是,虽然我从我的数据库Java获取记录了解非ASCII字母并将它们转换为希腊语,但是当我得到所有记录时会发生这种情况..这意味着我无法搜索特定名称例如导致它不能被确认 – Nomik

+0

好,但我如何使用UCanAccess? – Nomik

回答

1

当字符串包含代码点高于U + 007F的Unicode字符时,JDBC-ODBC桥将无法与Access ODBC驱动程序正常工作。希腊字符属于该类别,因此JDBC-ODBC Bridge方法不适用于您。 (更多详细信息here。)此外,JDBC-ODBC Bridge已从Java(自Java 8以来)中删除。

为了得到希腊字符的正确支持,我会推荐使用UCanAccess。有关如何设置的概述,请参阅我的另一个答案here

一旦您的项目已配置为使用UCanAccess你可以使用这样的代码跟你的Access数据库:

Connection conn=DriverManager.getConnection(
     "jdbc:ucanaccess://C:/__tmp/unicode.accdb"); 
String language = "Greek"; 

PreparedStatement ps = conn.prepareStatement(
     "SELECT [word], [english_equiv] " + 
     "FROM [vocabulary] " + 
     "WHERE language=?"); 
ps.setString(1, language); 
ResultSet rs = ps.executeQuery(); 
while (rs.next()) { 
    System.out.println(String.format(
      "\"%s\" is %s for \"%s\".", 
      rs.getString("word"), 
      language, 
      rs.getString("english_equiv"))); 
} 
rs.close(); 
ps.close(); 

String newWord = "ηλεκτρονικός υπολογιστής"; 
String newEnglishEquiv = "computer"; 
ps = conn.prepareStatement(
     "INSERT INTO [vocabulary] ([word], [language], [english_equiv]) " + 
     "VALUES (?,?,?)"); 
ps.setString(1, newWord); 
ps.setString(2, language); 
ps.setString(3, newEnglishEquiv); 
ps.executeUpdate(); 
System.out.println(String.format(
     "\"%s\" has been added to the table.", 
     newWord)); 

该代码产生以下控制台输出:

"γιορτή" is Greek for "feast" 
"ηλεκτρονικός υπολογιστής" has been added to the table. 

(翻译礼貌

+0

非常感谢您的先生!我真的很感谢你的时间!!我认为解决我的问题:D! – Nomik

+0

我可以问另一个问题。当我尝试执行rs.last();命令,它给了我这个错误:net.ucanaccess.jdbc.UcanaccessSQLException:功能不支持。这是为什么发生? – Nomik

1

如果调用ResultSet.first()或ResultSet.last(),则必须正确初始化Statement或PreparedStatement :

PreparedStatement ps =conn.prepareStatement("SELECT * FROM T1",ResultSet.TYPE_SCROLL_INSENSITIVE, 
       ResultSet.CONCUR_READ_ONLY); 

@Gord,感谢所有你正在做关于UCanAccess。