2014-02-21 93 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。