String day="20090605"; 
中间省略 
pst = conn.prepareStatement ("SELECT * FROM storesave WHERE liushuidanhao like ? order by liushuidanhao"); 
pst.setString(1, day+"'%'" ); 
rs = pst.executeQuery(); 
while(rs.next()) 

省略.... 

运行报错...[Microsoft][ODBC 驱动程序管理器] 无效的游标状态 
我的意思是要做一个模糊查询  SELECT * FROM storesave WHERE liushuidanhao like '20090605%' order by liushuidanhao    直接复制进sql里运行成功 
放在代码里就报错。. 
pst.setString(1, day+"'%'" );   我换成 pst.setString(1,day+"%");也试过 . 也写成过 like ?'%'
都试过了。....就是有问题
应该是查询成功了 但无符合记录  rs是空的  循环里的语句他一次都没执行.....
到底这个通配符应该怎么写.....

解决方案 »

  1.   

    pst.setString(1, "'" + day +"%'" );
    这样写就行
      

  2.   

    我数据库里的记录肯定存在 
    200906050001   200906050002 这样形式存在的.....
    没进循环就是没有查询到记录........
    why.............
    我sql里写 select * from storesave where liushuidanhao like '20090605%' 
    运行出来一大片记录....
      

  3.   


    pst.setString(1, "'" + day +"%'" ); 加转义符看看pst.setString(1, "'" + day +"\%'" ); 
      

  4.   

    你的这句pst.setString(1, day+"'%'" ); 百分号两边的单引号删掉!
      

  5.   

    完整的代码
    public void timesearch() {
    textArea.setText("");
    String day;
    day = (textField_1.getText().trim());

    System.out.println(day);
    try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    conn = DriverManager.getConnection("jdbc:odbc:project");
    pst = conn
    .prepareStatement ("select * from storesave where (liushuidanhao like ? ) order by liushuidanhao");
    pst.setString(1, day+"%" );  rs=pst.executeQuery();
    while(rs.next()){
    System.out.println("1");
    textArea.setText(textArea.getText() + "流水单号:"
    + rs.getString("liushuidanhao") + "  工单号:"
    + rs.getString("gongdanhao") + "  油漆名称"
    + rs.getString("mingchen") + "  总价"
    + rs.getString("totalprice") + "\n");
    }
    } catch (Exception ee) {
    ee.printStackTrace(); } finally {
    conn = null;
    rs = null;
    pst = null;
    } }
    谢谢...
      

  6.   

    //sqlStr = "select  id,name from 表 where name like ?"; 对应的是ps.setString(1, day+"%");
    //sqlStr = "select  id,name from 表 where name like '%'+?+'%'";这种方式对应的
    ps.setString(1, "abc");  //经过测试mysql中不支持这种写法,sqlserver支持,oracle没测试不清楚。 
      

  7.   


    //sqlStr = "select  id,name from 表 where name like ?"; 对应的是ps.setString(1, day+"%");
    //sqlStr = "select  id,name from 表 where name like '%'+?+'%'";这种方式对应的
    ps.setString(1, day);  //经过测试mysql中不支持这种写法,sqlserver支持,oracle没测试不清楚。 
    给分,闪人
      

  8.   

    while(rs.next()){ 省略}
    替换成 do{省略}
      while(rs.next()) 则还是报错显示 无效的游标状态
      

  9.   

    我以前遇到过和你一样的问题,不知能不能帮你解决,是这样的,我在调试状态下对rs.next()加了监视,你应该知道,rs是只进只读的,只能读一次,即使是在调试器中加了监视,它也算你读了一次,指针往下走了一次,所以造成程序中却读不到,因为监视中的监视式肯定是先于程序中的rs.next()执行的,除了这种情况和前面楼层朋友说的情况,实在想不起来还有什么可能了!
      

  10.   


    不进循环可能有几个问题:
    第一:驱动问题 你的 sun.jdbc.odbc.JdbcOdbcDriver换成com.microsoft.jdbc.sqlserver.SQLServerDriver试试
    第二:while(rs.next()){
    System.out.println("1");
    textArea.setText(textArea.getText() + "流水单号:"
    + rs.getString("liushuidanhao") + "  工单号:"
    + rs.getString("gongdanhao") + "  油漆名称"
    + rs.getString("mingchen") + "  总价"
    + rs.getString("totalprice") + "\n");
    } 是否打出1?如果打出1,说明rs是有结果的,如果没有打出1,试着把结果集设置成pst = conn
    .prepareStatement ("select * from storesave where (liushuidanhao like ? ) order by liushuidanhao",ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);  然后再看看
      

  11.   

    把条件去了直接
    select * from storesave
    试试
      

  12.   


    where 条件去掉后 查询成功
    我的textarea里终于有东西了
    表示 数据库连接没问题
    表示 问题还是出在 查询条件where (liushuidanhao like ? ) order by liushuidanhao........
      

  13.   

    SELECT * FROM storesave WHERE liushuidanhao
    liushuidanhao给他一个具体值试一下
      

  14.   

    把后面的order by 语句去了,看看有没有数据。
      

  15.   

    我不管setString 进去的%也好,还是直接写在查询语句里的 %也好
    他都当作是一个字符来处理  没有转译为sql里的通配符...
    头疼啊。..
    救命啊....
      

  16.   

    你debug一下,看看
    rs=pst.executeQuery(); 
    这句执行之前,你的pst里面的sql文和parameters分别都是什么
      

  17.   


    4个问号?
    pst.setString(1,day+"????");
    这样吗?
    老样子......
      

  18.   


    如果把后面的order by语句去了,有数据的话,那么可以这样试试,把order by换成group by...order by...看行不行。
      

  19.   


    pst = conn.prepareStatement("SELECT * FROM storesave WHERE liushuidanhao like ? order by liushuidanhao"); 
    pst.setString(1, day+"%" ); 
    这样应该可以啊