关于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)

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);

rs = stmt.execute(sql);或者 rs = stmt.executeQuery(sql);

正解

这是查询语句。。。不能用executeUpdate(sql)的。。。

executeUpdate(sql)用于更新操作

我感觉应该用executeQuery方法,返回一个结果集,executeUpdate(sql)用于更新操作.

这种错误 真的不应该犯 更不应该问 相信自己的能够解决

查询需要用executeQuery方法

rs = stmt.execute(sql);或者 rs = stmt.executeQuery(sql);
正解!!!

[quote="dabing013"]ret = stmt.executeUpdate(sql);

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

难道还要试么?

感觉你自己才需要试

[quote="枫叶29"]
[code="java"]
stmt = conn.createStatement();
sql = "select * from a";
ret = stmt.executeUpdate(sql);
[/code]
[code="exception"]java.sql.SQLException: Io 异常: Got minus one from a read call
[/code]
[/quote]

ret = stmt.executeUpdate(sql); 应该改为res = stmt.executeQuery(sql);

  1. 请确定你的 a表已经存在;
  2. 请确定你的数据库服务已启动;
  3. 查询操作请使用:stmt.executeQuery(sql); 方法;
  4. 更新操作请使用:stmt.executeUpdate(sql); 方法;
  5. 数据库的相关操作 请查看 J2SE 中 JDBC 部分。

1、请检查你的驱动包,不行换个。
2、如果用的是Eclipse,调试看看,养成调试的好习惯。

哈哈。不会吧。这么简单的东西。

1.程序错误在getConnection
因此,跟executeUpdate是没有关系的。虽然这个会在后面造成错误。

2.sqlplus / as sysdba

select * from v$version

确定一下oracle的版本先。

3.看一下你的oracle driver包是从哪里装载的。
通常是ojdbc14.jar
解压一下,看看描述文件中的版本是否跟step 2看到的一致。

4.不一致,则替换一下。
一致的话,看看listener.log/alert_sid.log有没有什么可以信息(ora-xx)

5.localhost换上ip看看。

噫,答案还不能改的。
补充一下:
6.查看sqlnet.ora等。

8) 实话点说,这问题确实不该问,犯了这错先给点耐心自己去解决,是连接?是配置?还是SQL连接语句问题?最好的解决办法莫过于自己先想办法解决。。费了吃奶的力还搞不定就来问问。。。楼上S已经正解啦!

帮你在网上搜了些资料:

针对:Got minus one from a read call
可能行的解决办法:

1.认为该问题是因为数据库连接池满了,解决办法是扩数据库连接池

2.
今天paidmail数据库负责人问我一个问题:
java.sql.SQLException: Io 异常:Got minus one from a read call

网上查了半天,有人遇到过这个问题,但是没有解决方案。后来上了metalink,搜索后找到这篇
https://metalink.oracle.com/metalink/plsql/f?p=130:14:11630255784642420701::::p14_database_id,p14_docid,p14_show_header,p14_show_help,p14_black_frame,p14_font:NOT,284090.1,1,1,1,helvetica

查看listerner日志,果然发现登陆时候有如下错误:
TNS-12546: TNS:permission denied
TNS-12560: TNS:protocol adapter error
TNS-00516: Permission denied

和产品负责人确认登陆ip,[b]发现果然不在sqlnet.ora中,加入后重启listerner,一切正常![/b]
原文出处:[url]http://zhaizhenxing.blog.51cto.com/643480/134864[/url]

第3种可能的办法

sqlnet.ora文件中
TCP.VALIDNODE_CHECKING=YES
将它改成
TCP.VALIDNODE_CHECKING=NO

查询怎么能是executeUpdate呢?又不是增删改,用executeQuery(sql)试试

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

你确信是8086?不是1521?
oracle默认1521

看输出的异常信息,显然是获取数据库连结时出现的错误。
跟后面的语句、表中有没有哪个表都没有什么关系。

所以,还是建议检查一下你的URL连结参数。
我记着我用的都是这样的形式:

[code]
Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521/XE");
[/code]
XE是快捷版的实例名,如果用的不是快捷版换成相应的实例名。

更正一下:
[code="java"]
Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521/XE",user,pwd);

[/code]