源码:import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
*/
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]
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、请检查你的驱动包,不行换个。
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]