关于Java连接Oracle数据库的。

源码:import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**

  • @author zhuyefeng
  • */
    public class ora {
    public static void main(String[] args){
    Connection conn = null;
    Statement stmt = null;
    ResultSet res = null;
    int ret;
    String sql = null;

    try {
        Class.forName("oracle.jdbc.driver.OracleDriver");
        conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:8086:Xe",
                                "yfzhu","yfzhu");
        stmt = conn.createStatement();
        sql = "select * from a";
        ret = stmt.executeUpdate(sql);
    
    } catch (ClassNotFoundException se) {
        // TODO: handle exception
        se.printStackTrace();
    }
    catch (SQLException e) {
        // TODO: handle exception
        e.printStackTrace();
    }
    

    }
    }

出错情况:
java.sql.SQLException: Io 异常: Got minus one from a read call
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:255)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:387)
at oracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.java:414)
at oracle.jdbc.driver.T4CConnection.(T4CConnection.java:165)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at www.zjut.jdbc.ora.main(ora.java:28)
[b]问题补充:[/b]
谢谢大家的回答,还是不行阿,
ResultSet res;
res = stmt.executeQuery(sql);
我试过了,端口我是改过的,由8080改为8086的,也有那个表a的。还有数据库也是运行的。
[b]问题补充:[/b]
SQL> select * from a;

ID FNAME LNAME


01 yf zhu

[b]问题补充:[/b]

BANNER

Oracle Database 10g Express Edition Release 10.2.0.1.0 - Product
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for Linux: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production

[b]问题补充:[/b]
java.sql.SQLException: Io 异常: Got minus one from a read call
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:334)
at oracle.jdbc.driver.OracleConnection.(OracleConnection.java:418)
at oracle.jdbc.driver.OracleDriver.getConnectionInstance(OracleDriver.java:521)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:325)
at java.sql.DriverManager.getConnection(DriverManager.java:582)
at java.sql.DriverManager.getConnection(DriverManager.java:185)
at oracle.Oracle.main(Oracle.java:30)

31个回答

1,端口,
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:[color=red]8086[/color]:Xe",
"yfzhu","yfzhu");

你确信是8086?不是1521?

2,ip,
查看listerner日志,看登陆数据库时有无一下错误
TNS-12546: TNS:permission denied
TNS-12560: TNS:protocol adapter error
TNS-00516: Permission denied

查看登陆ip,是否在sqlnet.ora中,如果不再加入后重启listerner服务

[size=large][color=red]ret[/color] = stmt.executeUpdate(sql); [/size]

改为[color=red]res[/color] = stmt.executeUpdate(sql); 试试

stmt = conn.createStatement();
sql = "select * from a";
//这是查询语句,怎么会用update
//ret = stmt.executeUpdate(sql);

[color=red]ret = stmt.executeQuery(sql); [/color]

读读api文档

int executeUpdate(String sql)
throws SQLException执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句(如 SQL DDL 语句)。

参数:
sql - SQL INSERT、UPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句
返回:
INSERT、UPDATE 或 DELETE 语句的行计数;或者 0,表示不返回任何内容的 SQL 语句

executeQuery
ResultSet executeQuery(String sql)
throws SQLException执行给定的 SQL 语句,该语句返回单个 ResultSet 对象。

参数:
sql - 要发送给数据库的 SQL 语句,通常为静态 SQL SELECT 语句
返回:
包含给定查询所生成数据的 ResultSet 对象;永远不能为 null

[size=xx-large][color=red]查询需要用executeQuery方法[/color][/size]

好多年不写这样的了,都忘了。

1、ret = stmt.executeUpdate(sql); 改成ret = stmt.execute(sql)返回值为boolean,或者ret=stmt.executeQuery(sql)返回值为结果集
2、却认orcal的端口是8086,默认是1521

jdbc连接有三种通道方式:
状态通道:statement
预通道:prepareStatement
过程通道:prepareCall
你用statement.executeUpdate()方法只对修改过的对象有效比如新增、修改、删除
而查询可以有2种
1是 statement.executeQuery(sql)
2是 statement.execute(sql); 这种对查询、新增、修改、删除都有效

你用的Select语句,只是查询,根本都没有update,所以用下面是对的
ret = stmt.executeQuery(sql);

Got minus one from a read call

返回一个负数怎么可以啊

res=stmt.executeQuery(sql);

祝你成功

程序的错误大家都指出来了,这样的错误怎么能犯呢。
rs = stmt.execute(sql);或者 rs = stmt.executeQuery(sql);

共31条数据 1 3 4 尾页
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问