2014-02-21 6 views
1

Я пытаюсь создать приложение, которое подключается к базе данных Access. Я сделал это через соединение ODBC моей программы Java с файлом .mdb, но у меня есть эта проблема с символами Unicode. Если запись написана на английских (латинских) символах, тогда файл .mdb распознает символы, но если запись записана на греческом языке, появляются некоторые странные символы, и я не могу получить запись с объектом ResultSet. Может кто-нибудь помочь?Проблемы с символами Unicode Java ODBC MS-Access

+0

Некоторые dbs имеют другой тип данных для данных, отличных от ascii. Строки Java - это Unicode по дизайну – Leo

+0

проблема заключается в том, что я получаю запись из своего db java, понимая буквы не-ascii и конвертируя их в греческий, но это происходит, когда я получаю все записи. Это означает, что я не могу найти конкретный имя, например, не может быть признано – Nomik

+0

нормально, но как я могу использовать UCanAccess? – Nomik

ответ

1

Мост JDBC-ODBC не работает корректно с драйвером Access ODBC, когда строки содержат символы Unicode, чья кодовая точка выше U + 007F. Греческие символы попадают в эту категорию, поэтому подход JDBC-ODBC Bridge не будет работать для вас. (Подробнее here.) Кроме того, мост JDBC-ODBC был удален с 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. 

(Перевод любезно Google Translate.)

+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.

Смежные вопросы