我将下面的代码发布到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();
}
}
Leigh Caldwe.. 5
字面上的答案是否定的 - 代码永远不存在任何"内在错误",它是否符合要求 - 可能包括也可能不包括可维护,安全,健壮或快速.
您运行的代码实际上是一个纯粹在Access中的JET查询 - 除了告诉Access运行查询之外,Java代码什么都不做.
一方面,如果没有破坏,请不要修理它.另一方面,它很有可能在不久的将来破裂,所以你可以提前修复它.
它可能破坏的两个可能原因是:
SQL注入风险.根据csvDirPath和csvFileName的来源(例如csvFileName可能来自用户上传的文件的名称?),以及Access JDBC驱动程序的巧妙程度,您可以通过插入一个来打破或删除数据的人分号(或一些括号以生成子查询)和一些其他SQL命令进入查询.
您依赖于CSV文件的列与Access表的列兼容.如果您正在上载未经检查的CSV,或者CSV生成器具有处理空值的特定方式,或者您有一天获得异常日期或数字格式,则可能会在插入Access表时出错.
说了这么多,我们都是关于实用主义的.如果上面的代码来自一个实用工作类,你将每周/每月/每年/手工使用几次,那么这不是一个真正的问题.
如果它是构成Web应用程序一部分的类,那么"官方"Java方法就是从CSV文件中读取记录(使用CSV解析器或CSV /文本JDBC驱动程序),得到记录集中的列,对它们执行一些验证或完整性检查,然后使用新的PreparedStatement将它们插入Access数据库.更麻烦但更强大.
您可以找到一些工具组合(例如对象关系层或其他数据访问工具),它们可以为您完成很多工作,但是设置工具将会像编写代码一样麻烦.然后,你会从任何一个中学到很多东西.
字面上的答案是否定的 - 代码永远不存在任何"内在错误",它是否符合要求 - 可能包括也可能不包括可维护,安全,健壮或快速.
您运行的代码实际上是一个纯粹在Access中的JET查询 - 除了告诉Access运行查询之外,Java代码什么都不做.
一方面,如果没有破坏,请不要修理它.另一方面,它很有可能在不久的将来破裂,所以你可以提前修复它.
它可能破坏的两个可能原因是:
SQL注入风险.根据csvDirPath和csvFileName的来源(例如csvFileName可能来自用户上传的文件的名称?),以及Access JDBC驱动程序的巧妙程度,您可以通过插入一个来打破或删除数据的人分号(或一些括号以生成子查询)和一些其他SQL命令进入查询.
您依赖于CSV文件的列与Access表的列兼容.如果您正在上载未经检查的CSV,或者CSV生成器具有处理空值的特定方式,或者您有一天获得异常日期或数字格式,则可能会在插入Access表时出错.
说了这么多,我们都是关于实用主义的.如果上面的代码来自一个实用工作类,你将每周/每月/每年/手工使用几次,那么这不是一个真正的问题.
如果它是构成Web应用程序一部分的类,那么"官方"Java方法就是从CSV文件中读取记录(使用CSV解析器或CSV /文本JDBC驱动程序),得到记录集中的列,对它们执行一些验证或完整性检查,然后使用新的PreparedStatement将它们插入Access数据库.更麻烦但更强大.
您可以找到一些工具组合(例如对象关系层或其他数据访问工具),它们可以为您完成很多工作,但是设置工具将会像编写代码一样麻烦.然后,你会从任何一个中学到很多东西.