1

我的 Access 数据库有一个表,其中有一列包含旁遮普语文本。我正在尝试使用 JDBC 从 Java (NetBeans) 处理该数据库。

我的代码是:

private void b1ActionPerformed(java.awt.event.ActionEvent evt)
{                                   
  try
  {                     
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + "D:\\PP.accdb";
    Connection conn = DriverManager.getConnection(url);
        System.out.println("Connection Successful");
        Statement stmt = conn.createStatement();
        stmt.execute("select * from Emp");
    ResultSet rs = stmt.getResultSet(); 
    if (rs != null)
        {  
                String s1,s2;
            s1=" ";
            s2=" ";
                while ( rs.next() )
                 {
                JOptionPane.showMessageDialog(null ,rs.getString(2), "Output" ,JOptionPane.INFORMATION_MESSAGE );
                 }
    }
            stmt.close();
            conn.close();
    }
    catch (Exception err) {         System.out.println("ERROR: " + err);         }

}                                  
4

1 回答 1

1

UCanAccess 3.x 版于 2015 年 8 月发布,现在支持表名和列名中的 Unicode 字符。请注意,此类名称需要用方括号括起来,至少对于 UCanAccess v3.0.0,例如:

sql = "SELECT [रंग], inEnglish FROM hindi";

 


(原答案)

如果,如您对该问题的评论所述,您有一个 Access 数据库,其表名和列名采用印地语或旁遮普语,那么从 Java 处理 Access 数据库的两种最常见的“直接”方法对您不起作用:

(1) JDBC-ODBC 桥

这是您一直在尝试使用的。不幸的是,当数据库包含包含高于代码点 U+007F 的字符的 Unicode 文本时,JDBC-ODBC 桥从未与 Access ODBC 驱动程序一起正常工作。这对于文本数据和表/列都是如此。此外,JDBC-ODBC 桥已过时:它已从 Java 8 中删除并且不受支持。所以,这个选项是一个死胡同。

(2) UCanAccess

UCanAccess可以成功读取/写入 Unicode 文本数据,但当前 (2.x) 版本无法使用包含高于代码点 U+007F 的 Unicode 字符的元数据(表/列名)。计划在 UCanAccess (3.x) 的下一个主要版本中支持表/列名称中的这些字符,但尚未宣布此类版本的时间表。

其他选项:

根据您需要操作的约束,您可能会考虑以下一种或多种解决方法。

  • 您可以将数据从 Access 数据库移动到另一个数据库,其 JDBC 驱动程序支持印地语和旁遮普语的元数据。

  • 您可以使用 C# 而不是 Java 构建您的应用程序。(Visual Studio 2013 社区版是免费提供的。)

  • 如果您真的必须坚持使用 Java,并且您的数据确实必须保留在 Access 数据库中,那么您可以安装 Microsoft SQL Server Express Edition,在 SQL Server 中创建一个指向 Access 数据库的“链接服务器”(详情请点击此处),然后使用JDBC Driver for SQL Server 对 Access 数据库运行查询。

于 2015-03-04T21:26:56.570 回答