0

我将下面的代码发布到 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(); } }
4

4 回答 4

6

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

您正在运行的代码实际上是纯粹在 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 数据库。更多的麻烦,但更强大。

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

于 2008-08-27T17:51:23.030 回答
2

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

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

于 2008-08-28T03:32:11.120 回答
1

@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 的更新。

于 2008-09-19T17:46:46.817 回答
0

约书亚·麦金农的问题:

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

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

于 2008-09-15T22:39:30.213 回答