代码之家  ›  专栏  ›  技术社区  ›  Gern Blanston

将CSV导入Access的Java代码

  •  0
  • Gern Blanston  · 技术社区  · 16 年前

    我把下面的代码发布到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 回复  |  直到 12 年前
        1
  •  5
  •   Leigh Caldwell    16 年前

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

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

    一方面,如果它没有坏,不要修理它。另一方面,很有可能在不久的将来它会破裂,所以你可以试着预先修理它。

    可能破裂的两个原因是:

    1. SQL注入风险。取决于csvDirPath和csvFileName的来源(例如,csvFileName可能来自用户上传的文件名?),并且关于Access JDBC驱动程序有多聪明,您可以通过在查询中插入分号(或一些方括号来生成子查询)和一些附加的SQL命令来打开某人来中断或删除您的数据。
    2. 您依赖于CSV文件的列与Access表的列兼容。如果您未选中正在上载的CSV,或者CSV生成器具有处理空值的特定方式,或者如果有一天您获得了不寻常的日期或数字格式,则在插入Access表时可能会出现错误。

    说到这里,我们都是实用主义者。如果上面的代码来自一个实用程序类,您每周/每月/每年/每次都要手工使用几次,那么这并不是一个真正的问题。

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

    您可能会发现一些工具(例如对象关系层或其他数据访问工具)的组合,它们可以为您做很多事情,但是设置这些工具和编写代码一样麻烦。再说一遍,你会从这两个中学到很多东西。

        2
  •  2
  •   Joshua McKinnon    16 年前

    一个警告字——JDBC-GT;访问查询(使用ODBC桥接)在64位系统上不工作,因为没有64位访问数据库驱动程序(驱动程序被包含在Windows的32位拷贝中,只能由32位进程访问)。您可以运行“odbcad32”或查看ODBC控制面板以查看驱动程序是否存在)

    虽然在您的代码片段中看不到带有连接字符串的代码,但我不知道有任何针对Java的非商业访问JDBC驱动程序,只有JDBC->odbc桥接和依赖于Windows的访问(*mdb)驱动程序。微软不再支持这个驱动程序,也不打算把它移植到64位,所以从基础设施的角度来看,它是值得考虑的。

        3
  •  1
  •   Chris OC    16 年前

    @david.w.fenton.myopenid.com:“你能提供一个引用,说明微软计划永远不为Jet引入64位ODBC驱动程序吗?”

    大卫,我在微软的连接反馈上找到了一个帖子。

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

    “目前还没有计划由Office团队发布64位版本的JET driver。我们可能会考虑其他选择,并在我们有具体计划时向您提供最新信息。”

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

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

        4
  •  0
  •   GEOCHET S.Lott    15 年前

    问约书亚麦金农:

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

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