public static void main(String[] args) {
try {
Class.forName(driver);
Connection conn=DriverManager.getConnection(url,name,pwd);
//String sql="select * from usertabl e where u_pass=? and u_name=? ";
String sql="select * from username where name=? and pwd=?";
                      
PreparedStatement ps=conn.prepareStatement(sql);

ps.setString(1,"sa");
ps.setString(2,"sa");
ResultSet rs=ps.executeQuery();
if(rs.next()){
System.out.println(rs.getString("name"));

}
} catch (ClassNotFoundException e) {

e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}}代码是没有问题的的,测试了很多测,就是用oracle数据调用ps.setString()方法替换占位符,值传不进去,
但是用sqlserver2000这句完全成功。   oracle的数据库驱动也换过,oracle也重装过,问题一直无法解决、
但是把前面的sql换成这样String sql="select * from username where name='sa' and pwd='sa'";是可以执行的
求解决到底是什么问题,。

解决方案 »

  1.   

    where name=:name 
               rs.setString(name,"sa")
    这样多好,不用考虑占位符从0还是从1开始
      

  2.   

    是从1开始的,就是传值不进去。。同样的代码,sqlserver2000可以,,oracle不行。你那样貌似不能用吧,参数只能是int型的
      

  3.   

    直接写太麻烦了。现在在学这个oracle不然不用他了没人碰到过这个问题么
      

  4.   

    可能和数据库隔离级别或者权限之类的有关吧,lz代码应该没问题,是不是oracle设置什么了,读不出东西来?
      

  5.   

    那不知道了。应该没有设,装好就没怎么动,重装了还是这个问题,不能用占位符,这个是简化的测试代码,我弄了一天才发现是这个问题。不用占位符是可以得到想要的结果的。但是想用这个方法,比如插入更新之类的操作,不用占位符很麻烦。。我都郁闷死,难道是我电脑有问题。、、实在不行只能换sqlserver了。
      

  6.   

    数据库驱动类与版本有关系,我写的一个传输,下级数据库从805到10g的版本都有,一开始用thin方式连接,结果执行sql语句时发生异常,后来用9i做数据库客户端,用9i的驱动类,用oci方式连接,异常消失。不过像楼主这种情况,倒是没遇到过。
      

  7.   

    我以前遇到这样的错  但是那是Hibernate链接Orcale  但是我想你的帐号和密码都是字符串型的,和用储存过程是一样的,要配链接的 String sql=String.format("select * from username where name='{0}' and pwd='{1}'",new Object []{"sa","sa"} ); 试试这个啊