问题描述:在用JAVA的PreparedStatement做模糊查询时,SQL2000是肯定不出结果的。用SQL2005只能在我的机器上出结果,换台机器就不出结果。
我试过两中方式去做,代码如下:
1.String sql = "Select * FROM TableName Where ColumnName like '%'+?+'%'";   
  PreparedStatement stmt = conn.preparedStatement(sql);   
  stmt.setString(1, parameter);
2.String sql = "Select * FROM TableName Where ColumnName like ?";   
  PreparedStatement stmt = conn.preparedStatement(sql);   
  stmt.setString(1, "%"+parameter+"%");
我可以保证的是其他的相关的代码都是正确的,因为你只要把SQL语句换成Select * FROM TableName Where ColumnName=?就一定会出结果,我在想是不是因为数据库的设置问题导致了这样的问题,到现在还是没有找到好的解决方案,希望有高人可以指点一下小弟!

解决方案 »

  1.   

    1、String sql = "Select * FROM TableName Where ColumnName like '%?%'";  2、String sql = "Select * FROM TableName Where ColumnName like '?'";
    感觉你写的好像不大对,试试我帮你改的(我也不确定) 要不直接这样写
    String sql = "Select * FROM TableName Where ColumnName like '%"+parameter+"'"; 
      

  2.   


    改一下
    String sql = "Select * FROM TableName Where ColumnName like '%"+parameter+"%'"; 
      

  3.   

    String sql = "Select * FROM TableName Where ColumnName like '%"+parameter+"%'"; 
      

  4.   

    String sql = " Select * FROM TableName Where ColumnName like % " + parameter + " % "; 
      

  5.   

    1. "Select * FROM TableName Where ColumnName like '%'+?+'%'"
    替换 ? 后变
    "Select * FROM TableName Where ColumnName like '%'+'YourColumnValue'+'%'"
    了,当然不行。2. "Select * FROM TableName Where ColumnName like ?"
    stmt.setString(1, "%"+parameter+"%");
    替换时会将 % 转义化表示的,即把 % 当成查询内容的一部分而不是通配符了。试试不用 PreparedStatement 自己拼接 SQL 语句再通过 Statement 执行。
      

  6.   

    PreparedStatement 的 setString 方法不仅仅是完成用字符串替换问号,它还会将字符串中出现的在 SQL 中有特殊意义的字符作转义化替换处理,所以你 "%"+parameter+"%" 中的 % 会被自动替换为其转义化形式被当成普通字符处理了。
    可以自己作字符串替换:
    String sql = "SELECT * FROM TableName WHERE ColumnName like '%?%'";
    sql = sql.replaceFirst("\\?", parameter);
    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery(sql);
    这样就避免了 PreparedStatement setString 时把 % 用其转义化表示形式替换了。
      

  7.   

    是不是参数乱码的问题,你调试输出parameter看看是否正确
      

  8.   


    非常感谢sagezk 提供的方法,但是没有达到我要的结果,我要用预编译做出结果,难道PreparedStatement不支持like查询?
      

  9.   


    确实值得怀疑数据库设置的问题(我是不会SQL Server),我用Access2007试验了下,两种方式都能用。
      

  10.   

    晕,怎么自己发的贴也不能修改??ps:“conn.preparedStatement(sql);”应为“conn.prepareStatement(sql);”
      

  11.   

    支持“帽子”的
    试试不用 PreparedStatement 自己拼接 SQL 语句再通过 Statement 执行。  
    这个说法。
      

  12.   

    哈哈...  模糊查询好像不能用预处理语句.
    我也遇到过. 最好用了Statement完成了工作
      

  13.   

    这样不知道行不行,猜测而已,LZ自已去运行,不行也发个话出来,呵呵String sql = "Select * FROM TableName Where ColumnName like ?";  
    PreparedStatement stmt = conn.preparedStatement(sql);  
    stmt.setString(1, "'%"+parameter+"%'"); 
      

  14.   

    String sql = "Select * FROM TableName Where ColumnName like '%?%'";  
    conn.preparedStatement(sql); 改成 conn.prepareStatement(sql);
      

  15.   

    String sql = "Select * FROM TableName Where ColumnName like ?";  
      PreparedStatement stmt = conn.preparedStatement(sql);  
      stmt.setString(1, "%%"+parameter+"%%"); %%转义后为%另在中文系统中,Java字符默认编码为GBK,而SQL2000默认为UTF。做中文查询时,要注意转换
      

  16.   


    这是笔误哈,代码是正确的,问题的关键在于预编译的like查询时涉及到的问题。
      

  17.   

    另外小弟在此求一HSQLDB的数据库一个,希望有点兄弟们能给一个,我到官方网站上去下,下不下來。
    愿意的可以发到
    或者加我的QQ:408682690
    小弟不胜感激!
      

  18.   

    是驱动的问题,换成JTDS,你就可以看到结果了。
      

  19.   


    应该不是数据库设置的问题。JDBC 实际上只是一套操作数据库的规范,而规范中对 PreparedStatement 的实现者的要求是对一切特殊字符作转义处理,也许下一个 JDBC 规范的版本能考虑到楼主的需求。
      

  20.   

    http://download.chinaunix.net/download.php?id=8904&ResourceID=4475 这儿能下到 hsqldb_1_7_3_1.zip。这两天 www.sourceforge.net 访问不了,希望不是被 GFW 和谐了。 
      

  21.   

    1.String sql = "Select * FROM TableName Where ColumnName like '%'+?+'%'"; 
      PreparedStatement stmt = conn.preparedStatement(sql); 
      stmt.setString(1, parameter);
    2.String sql = "Select * FROM TableName Where ColumnName like ?"; 
      PreparedStatement stmt = conn.preparedStatement(sql); 
      stmt.setString(1, "%"+parameter+"%"); 第一种写法是不对的,第二种是正确的。第二种我在 SQL Server 2000 中用过,完成可以达到效果的啊。
      

  22.   

    请问LS的大牛,
    为什么我在Access2007种两种都可以正确执行呢??
      

  23.   

    楼主,第二种方法是可以了,在创建数据库的时候字符集选择“as_china。”后面我忘记了,你看一下