【问题标题】:Java code to import CSV into Access将 CSV 导入 Access 的 Java 代码
【发布时间】:2010-09-07 00:55:57
【问题描述】:

我将下面的代码发布到 Sun 开发者论坛,因为我认为它是错误的(真正的错误是在此代码被命中之前)。我得到的答复之一说它不起作用并把它扔掉。但它实际上是有效的。它可能不是最好的代码(我是 Java 新手),但它是否存在固有的“错误”?

=============

代码:

private static void ImportFromCsvToAccessTable(String mdbFilePath, String accessTableName , String csvDirPath , String csvFileName ) throws ClassNotFoundException, SQLException { Connection msConn = getDestinationConnection(mdbFilePath); try{ String strSQL = "SELECT * INTO " + accessTableName + " FROM [Text;HDR=YES;DATABASE=" + csvDirPath + ";].[" + csvFileName + "]"; PreparedStatement selectPrepSt = msConn.prepareStatement(strSQL ); boolean result = selectPrepSt.execute(); System.out.println( "result = " + result ); } catch(Exception e) { System.out.println(e); } finally { msConn.close(); } }

【问题讨论】:

    标签: java ms-access csv


    【解决方案1】:

    向 Joshua McKinnon 提问:

    您能否提供有关 MS 计划永远不会为 Jet 引入 64 位 ODBC 驱动程序的引文?这听起来很合理,所以我一点也不怀疑你,我只是想知道你是否有可以指出的来源。

    当然,MS 通过 OLEDB 提供对 64 位系统上的 Jet 的访问权限,对吧?这对 JDBC 没有帮助,但肯定提供了一种使用 Jet 数据的方法(他们必须提供一些东西,因为 Jet 4 是操作系统的一部分,因为它被用作 Active Directory 的数据存储,因此已被使用自 Windows 2000 起)。

    【讨论】:

      【解决方案2】:

      @david.w.fenton.myopenid.com:“您能否提供一个关于 MS 计划永远不会为 Jet 引入 64 位 ODBC 驱动程序的引文?”

      大卫,我在 Microsoft 的 Connect 反馈上找到了一篇关于此的帖子。

      http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=125117

      “目前,Office 团队没有计划发布 64 位版本的 JET 驱动程序。我们可能会考虑替代选项,并会在我们有具体计划时更新您。”

      谢谢, SSIS 团队。 Microsoft 于 2007 年 10 月 3 日晚上 9:47 发布

      该反馈线程中没有来自 Microsoft 的更新。

      【讨论】:

        【解决方案3】:

        警告 - jdbc -> Access 查询(使用 odbc 进行桥接)在 64 位系统上不起作用,因为不存在 64 位 Access 数据库驱动程序(该驱动程序包含在 Windows 的 32 位副本中,并且只能被 32 位进程访问。您可以运行“odbcad32”或查看 ODBC 控制面板以查看驱动程序是否存在)

        虽然我没有在您的代码 sn-p 中看到带有连接字符串的代码,但我不知道任何用于 Java 的非商业 Access JDBC 驱动程序,只有 jdbc->odbc 桥接并依赖 Windows 来获得 Access ( *.mdb) 驱动程序。 Microsoft 不再支持此驱动程序,也没有计划将其移植到 64 位,因此在基础架构方面需要考虑。

        【讨论】:

        • Access 2010 有 64 位驱动程序。
        【解决方案4】:

        字面上的答案是否定的 - 代码从来没有任何“内在错误”,而是它是否满足要求的问题 - 这可能包括也可能不包括可维护性、安全性、健壮性或快速性。

        您正在运行的代码实际上是纯粹在 Access 中的 JET 查询 - Java 代码除了告诉 Access 运行查询之外什么都不做。

        一方面,如果它没有坏,就不要修理它。另一方面,它很有可能会在不久的将来发生故障,因此您可以尝试提前修复它。

        它可能崩溃的两个可能原因是:

        1. SQL 注入风险。根据 csvDirPath 和 csvFileName 的来源(例如 csvFileName 可能来自用户上传的文件的名称?),以及 Access JDBC 驱动程序的聪明程度,您可以通过插入分号(或一些用于创建子查询的括号)和一些额外的 SQL 命令到查询中。
        2. 您依赖 CSV 文件的列与 Access 表的列兼容。如果您上传了未经检查的 CSV,或者如果 CSV 生成器具有处理空值的特定方式,或者如果您有一天会收到不寻常的日期或数字格式,则在插入 Access 表时可能会出错。

        说了这么多,我们在这里都是关于实用主义的。如果上面的代码来自一个实用程序类,您将每周/每月/每年/永远手动使用几次,那么这不是一个真正的问题。

        如果它是构成 Web 应用程序一部分的类,那么“官方”Java 方法是从 CSV 文件中读取记录(使用 CSV 解析器或 CSV/文本 JDBC 驱动程序) ,从记录集中取出列,对它们进行一些验证或完整性检查,然后使用新的 PreparedStatement 将它们插入 Access 数据库。麻烦更多,但更健壮。

        您可能会找到一种工具组合(例如对象关系层或其他数据访问工具),它们可以为您完成很多工作,但设置工具与编写代码一样麻烦。话又说回来,你会从任何一个中学到很多东西。

        【讨论】:

          猜你喜欢
          • 2016-05-22
          • 1970-01-01
          • 2015-06-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多