用于将CSV导入Access的Java代码

时间:2008-08-27 17:38:31

标签: java ms-access csv

我将以下代码发布到Sun开发人员论坛,因为我认为它是错误的(真正的错误是在此代码被击中之前)。我得到的其中一个回答说它不起作用并把它扔掉。但实际上它正在发挥作用。它可能不是最好的代码(我是Java的新手),但它本身就存在“错误”吗?

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

CODE:

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 个答案:

答案 0 :(得分:5)

字面上的答案是否定的 - 代码永远不存在任何“内在错误”,它是否符合要求 - 可能包括也可能不包括可维护,安全,健壮或快速。

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

一方面,如果没有破坏,请不要修理它。另一方面,它很有可能在不久的将来破裂,所以你可以提前修复它。

它可能破坏的两个可能原因是:

  1. SQL注入风险。根据csvDirPath和csvFileName的来源(例如csvFileName可能来自用户上传的文件的名称?),以及Access JDBC驱动程序的巧妙程度,您可以通过插入一个打破或删除数据的人开放分号(或一些用于创建子查询的括号)和一些其他SQL命令进入查询。
  2. 您依赖于CSV文件的列与Access表的列兼容。如果您上传了未经检查的CSV,或者CSV生成器具有处理空值的特定方式,或者您有一天获得异常日期或数字格式,则可能会在插入Access表时出错。
  3. 说了这么多,我们都是关于实用主义的。如果上面的代码来自一个实用工作类,你将每周/每月/每年/手工使用几次,那么这不是一个真正的问题。

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

    你可能会找到一些工具组合(例如对象关系层或其他数据访问工具),它们可以为你做很多事情,但是设置工具将会像编写代码一样麻烦。然后,你会从任何一个中学到很多东西。

答案 1 :(得分:2)

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

虽然我没有在代码片段中看到带有连接字符串的代码,但我不知道任何针对Java的非商业性Access JDBC驱动程序,只有jdbc-> odbc桥接并依赖Windows来访问(* .mdb)驱动程序。微软不再支持这种驱动程序,并且没有计划将其移植到64位,因此需要考虑基础架构。

答案 2 :(得分:1)

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

大卫,我在微软的Connect Feedback上找到了一篇关于此事的帖子。

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

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

谢谢, SSIS团队。  由Microsoft于2007年10月3日下午9:47发布

微软在该反馈帖中没有更新。

答案 3 :(得分:0)

Joshua McKinnon提问:

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

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