我将以下代码发布到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();
}
}
答案 0 :(得分:5)
字面上的答案是否定的 - 代码永远不存在任何“内在错误”,它是否符合要求 - 可能包括也可能不包括可维护,安全,健壮或快速。
您运行的代码实际上是一个纯粹在Access中的JET查询 - 除了告诉Access运行查询外,Java代码什么都不做。
一方面,如果没有破坏,请不要修理它。另一方面,它很有可能在不久的将来破裂,所以你可以提前修复它。
它可能破坏的两个可能原因是:
说了这么多,我们都是关于实用主义的。如果上面的代码来自一个实用工作类,你将每周/每月/每年/手工使用几次,那么这不是一个真正的问题。
如果它是构成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开始。)