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 的问题吗?谢谢了
while(rs.next()){
System.out.println(rs.getString(1)+rs.getString(2));
}
要是换成
while(rs.next()){
System.out.println(rs.getString("username")+rs.getString("password"));
}怎么还是有错?
这句应该执行一句查询语句才可以返回一个ResultSet,你的是一个insert语句肯定不行。
加一句ps = conn.prepareStatement("select * from users");试一下。
是用于查询语句的, 不能用于插入语句!
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();
}}为什么还是报错?
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语句。
你可以做一个插入的方法专门做插入。
用一个查询的方法专门做查询。
要查询的话需要PreparedStatement ps = conn.prepareStatement("select * from users");ResultSet rs = ps.executeQuery();但是这样没有意义,一般来说,PreparedStatement 适合与只有部分参数变化的情况也就是与写存储过程时的绑定变量类似的功能例如:conn.preparedStatement("select * from users where user=?");这样每次user不同时可以大幅的提高效率。
而且API里写的,Statement的executeQuery方法带参,PreparedStatement的executeQuery方法不带参
如果真要想查询的话还是不要那样写吧
ResultSet rs = ps.executeQuery("select *from users");
while(rs.next()){
System.out.println(rs.getString("username")+rs.getString("password"));
}问题是,有username和password这两个字段名吗?