所有值都未插入数据库中

时间:2014-01-14 11:48:11

标签: java sql oracle java-ee

我有一个超过20000 row s的excel文件,它有大量数据,并且该文件中的数据通过java程序插入到数据库中。

每当我运行该文件时,都会跳过某些值,而不会将其插入数据库。

任何人都可以解释为什么会如此?

此外,在插入超过300个值后, ORA-00933:抛出SQL命令未正确结束的异常。

3 个答案:

答案 0 :(得分:2)

出于安全原因(以及其他原因),您不应该只是在没有正确转义输入的情况下将输入连接到语句中。

使用预准备语句,这将使数据库或驱动程序能够处理输入中转义的特殊字符。如果没有逃避,您最终可能会遇到无效甚至有害的查询。

示例:

String a1Va2 = "';DROP table ata_keywords;'";

rs=ss.executeQuery("select keyword,ata_code,ac_model from ata_keywords where keyword='"+a1Va2+"'"); 

这将导致两个查询:

select keyword,ata_code,ac_model from ata_keywords where keyword='';
DROP table ata_keywords; //Ooops
'' //the last bit is ignored

您获得的异常表示某些输入包含导致查询无效的序列。

答案 1 :(得分:0)

托马斯已经解释了我的想法,SQL Injection 通过在a preparedStatement中使用绑定变量,我们可以避免对查询字符串进行黑客攻击。

String queryString = "select keyword,ata_code,ac_model from ata_keywords where keyword = ?1";

PreparedStatement ss = conn.prepareStatement(queryString);

s.setString(1,a1Va2);

rs = ss.executeQuery();

如果您希望您的Query版本能够正常工作...... 用双引号替换单引号以逃避它。

rs=ss.executeQuery("select keyword,ata_code,ac_model from ata_keywords where keyword='"+a1Va2.replace("'","''")+"'"); 

答案 2 :(得分:0)

如果您知道插入的记录序列,问题记录将是恢复成功插入之前的记录。 记录加载序列遇到错误并导致前一个插入语句的隐式回滚,因此缺少记录插入块。 错误本身看起来像一个缺失的括号。