问题描述:在用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.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=?就一定会出结果,我在想是不是因为数据库的设置问题导致了这样的问题,到现在还是没有找到好的解决方案,希望有高人可以指点一下小弟!
感觉你写的好像不大对,试试我帮你改的(我也不确定) 要不直接这样写
String sql = "Select * FROM TableName Where ColumnName like '%"+parameter+"'";
改一下
String sql = "Select * FROM TableName Where ColumnName like '%"+parameter+"%'";
替换 ? 后变
"Select * FROM TableName Where ColumnName like '%'+'YourColumnValue'+'%'"
了,当然不行。2. "Select * FROM TableName Where ColumnName like ?"
stmt.setString(1, "%"+parameter+"%");
替换时会将 % 转义化表示的,即把 % 当成查询内容的一部分而不是通配符了。试试不用 PreparedStatement 自己拼接 SQL 语句再通过 Statement 执行。
可以自己作字符串替换:
String sql = "SELECT * FROM TableName WHERE ColumnName like '%?%'";
sql = sql.replaceFirst("\\?", parameter);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
这样就避免了 PreparedStatement setString 时把 % 用其转义化表示形式替换了。
非常感谢sagezk 提供的方法,但是没有达到我要的结果,我要用预编译做出结果,难道PreparedStatement不支持like查询?
确实值得怀疑数据库设置的问题(我是不会SQL Server),我用Access2007试验了下,两种方式都能用。
试试不用 PreparedStatement 自己拼接 SQL 语句再通过 Statement 执行。
这个说法。
我也遇到过. 最好用了Statement完成了工作
PreparedStatement stmt = conn.preparedStatement(sql);
stmt.setString(1, "'%"+parameter+"%'");
conn.preparedStatement(sql); 改成 conn.prepareStatement(sql);
PreparedStatement stmt = conn.preparedStatement(sql);
stmt.setString(1, "%%"+parameter+"%%"); %%转义后为%另在中文系统中,Java字符默认编码为GBK,而SQL2000默认为UTF。做中文查询时,要注意转换
这是笔误哈,代码是正确的,问题的关键在于预编译的like查询时涉及到的问题。
愿意的可以发到
或者加我的QQ:408682690
小弟不胜感激!
应该不是数据库设置的问题。JDBC 实际上只是一套操作数据库的规范,而规范中对 PreparedStatement 的实现者的要求是对一切特殊字符作转义处理,也许下一个 JDBC 规范的版本能考虑到楼主的需求。
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 中用过,完成可以达到效果的啊。
为什么我在Access2007种两种都可以正确执行呢??