import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Jdbctest { public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@192.168.1.102:1521:ora9";
String username = "scott";
String password = "tiger";
Connection conn = DriverManager.getConnection(url, username, password);

PreparedStatement ps = conn.prepareStatement("insert into users values(?,?)");
ps.setString(1, "ljk");
ps.setString(2, "3015");
int i = ps.executeUpdate();

System.out.println(i);
ResultSet rs = ps.executeQuery();

while(rs.next()){
System.out.println(rs.getString(1)+rs.getString(2));
}
rs.close();
ps.close();
conn.close();
}}
跑的时候报错:
Exception in thread "main" java.sql.SQLException: 无效的列索引
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:269)
at oracle.jdbc.driver.OracleStatement.prepare_for_new_get(OracleStatement.java:3199)
at oracle.jdbc.driver.OracleStatement.getStringValue(OracleStatement.java:3444)
at oracle.jdbc.driver.OracleResultSetImpl.getString(OracleResultSetImpl.java:434)
at lyon.jdbc.Jdbctest.main(Jdbctest.java:42)请问下是PreparedStatement 的问题吗?谢谢了

解决方案 »

  1.   


            while(rs.next()){
                System.out.println(rs.getString(1)+rs.getString(2));
            }
    要是换成
            while(rs.next()){
              System.out.println(rs.getString("username")+rs.getString("password"));
            }怎么还是有错?
      

  2.   

     ResultSet rs = ps.executeQuery();
    这句应该执行一句查询语句才可以返回一个ResultSet,你的是一个insert语句肯定不行。
    加一句ps = conn.prepareStatement("select * from users");试一下。
      

  3.   

    ps.executeQuery();
    是用于查询语句的, 不能用于插入语句!
      

  4.   

    PreparedStatement有这个方法的呢
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    public class Jdbctest { public static void main(String[] args) throws ClassNotFoundException, SQLException {
    Class.forName("oracle.jdbc.driver.OracleDriver");
    String url = "jdbc:oracle:thin:@192.168.1.102:1521:ora9";
    String username = "scott";
    String password = "tiger";
    Connection conn = DriverManager.getConnection(url, username, password);

    PreparedStatement ps = conn.prepareStatement("insert into users values(?,?)");
    ps.setString(1, "ljk");
    ps.setString(2, "3015");
    int i = ps.executeUpdate();

    System.out.println(i);
    ResultSet rs = ps.executeQuery("select *from users");


    while(rs.next()){
    System.out.println(rs.getString("username")+rs.getString("password"));
    }
    rs.close();
    ps.close();
    conn.close();

    }}为什么还是报错?
      

  5.   

    那这样说来PreparedStatement中的那个excuteQuery()方法不是没用了吗?还不是要用了从Statement中继承过来的方法?
      

  6.   

    你先看看插进去没有? 另外你没有select操作 如何取得数据 当然是空
      

  7.   


            PreparedStatement ps = conn.prepareStatement("insert into users values(?,?)");
            ps.setString(1, "ljk");
            ps.setString(2, "3015");
            int i = ps.executeUpdate();
    //这只是一个插入语句,并不返回结果集,所有没有办法用executeQuery()方法返回结果集
        
    但是如果你想返回结果集:ResultSet rs = ps.executeQuery();前面必须使用select语句。
    你可以做一个插入的方法专门做插入。
    用一个查询的方法专门做查询。
            
            
      

  8.   

    你程序缺少select 语句,如楼上
      

  9.   

    PreparedStatement 是为了提高效率先对要执行的SQL进行优化,可以更新也可以查询,
    要查询的话需要PreparedStatement ps = conn.prepareStatement("select * from users");ResultSet rs = ps.executeQuery();但是这样没有意义,一般来说,PreparedStatement 适合与只有部分参数变化的情况也就是与写存储过程时的绑定变量类似的功能例如:conn.preparedStatement("select * from users where user=?");这样每次user不同时可以大幅的提高效率。
      

  10.   

    补充,ps 无论是 executeQuery 还是 executeUpdate ,都是针对该对象最近的一次 prepare 用的SQL
      

  11.   

    我觉得9楼的说的有道理,楼主不用那么麻烦
    而且API里写的,Statement的executeQuery方法带参,PreparedStatement的executeQuery方法不带参
    如果真要想查询的话还是不要那样写吧
      

  12.   

    System.out.println(i);
            ResultSet rs = ps.executeQuery("select *from users");
            
            
            while(rs.next()){
                System.out.println(rs.getString("username")+rs.getString("password"));
            }问题是,有username和password这两个字段名吗?