有一个比较BT的很长的SQL文。 不知道是哪位大神写出来的。
在测试时发现一下的问题:
①检索结果里面有8条数据, 把执行完的SQL文用statement直接执行。
得到的结果SUM(DEL_FLAG)是1.
②把sql文中设置参数的地方换成“?”,把参数和sql设置到preparedstatement,再执行preparedstatement.executeQuery()执行sql,检索结果SUM(DEL_FLAG)是16.检索结果是SUM(DEL_FLAG),是想看一下DB中被删除掉的数据有多少条。
正确的结果应该是一条。即8条数据中,有一条被删除了。把sql文放在osqledit中执行是1, 但是用preparedstatement检索结果竟然变成了16.首先保证。 2次执行的sql文完全一致,设置参数完全一致。 区别就是,一个是设置完参数的。一个是sql里面是?的想请教一下大家,preparedstatement和statement在什么情况下会发生检索结果不一致?
跟sql文有关么? 好明确一下调查方向。 现在完全是迷惑的状态啊。

解决方案 »

  1.   

    preparedstatement和statement执行结果应该是相同的,区别只是在于他们执行前的准备工作,
    statement每次执行都会对SQL做分析,而preparedstatement对相同的SQL只做一次分析,
    所以很明显preparedstatement对批量执行可以提升效率,但结果应该都是一样的,
    所以估计应该是你那参数传递的问题
      

  2.   

    你的sql以及传递的参数,执行结果应该是一样的。
      

  3.   

    1、statement用于执行静态SQL语句并返回它所生成结果的对象。
    2、preparedstatement表示预编译的SQL语句的对象,SQL语句被预编译并存储在对象中,被封住的SQL语句代表某一类操作。在使用preparedstatement对象执行SQL命令时,SQL命令被数据库进行解析和编译,然后被放到命令缓冲区。然后,每当执行同一个preparedstatement对象时,他就会被在解析一次,但不会被再次编译。
    3、在使用statement之前,拼写SQL语句时,如若不慎,参数值含有“””、“‘”和“,”等特殊字符时,该SQL语句就是非法的。但是preparedstatement是将参数值和SQL语句分开的,即时有特殊字符也能正确执行。
    4、根据以上分析得出,应该是与参数有关系。
      

  4.   

    preparedstatement和执行结果应该是相同的,区别是在于他们执行前的准备工作,
    statement每次执行都会对SQL做分析,而preparedstatement对相同的SQL只做一次分析,所以很明显preparedstatement对批量执行可以提升效率,但结果应该都是一样的,
    preparedstatement一次编译后在内存中就不会消失,而statement每次都要编译
      

  5.   

    任何情况下都不会存在不一样的结果!数据库服务器和 JDBC 都是产品级别的东西,都是经过非常严格的测试才发布的,因此绝对不会存在 PreparedStatement 与 Statement 执行结果不一致的情况!
      

  6.   

    当然了,并不能保证数据库服务器和 JDBC 驱动程序没有 BUG,但在普通 SQL 应用的层次上 BUG 率可以认为是 0
      

  7.   


    很显然,你认为是数据库或者是 JDBC 驱动有 BUG。这么跟你说吧,如果数据库或者 JDBC 出现这种低级 BUG 的话,那数据库厂商 100% 是混不下去了。先从自己的代码找原因,再从两次执行的上下文中找原因,比如第一次执行时数据表中有 100 条数据,第二次执行时数据表中只有 80 条数据,那两次执行的结果肯定是不一样的!
      

  8.   

    主楼好好看看参数吧.参数一定有问题,把SQL文分段执行看结果.再找.