惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Jina AI
Jina AI
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
B
Blog
T
The Blog of Author Tim Ferriss
量子位
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - Franky
小众软件
小众软件
Recent Announcements
Recent Announcements
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
I
InfoQ
美团技术团队
G
Google Developers Blog
Engineering at Meta
Engineering at Meta
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
V
Visual Studio Blog
云风的 BLOG
云风的 BLOG
博客园 - 【当耐特】
IT之家
IT之家
Microsoft Security Blog
Microsoft Security Blog
博客园 - 聂微东
Last Week in AI
Last Week in AI
H
Hackread – Cybersecurity News, Data Breaches, AI and More
H
Help Net Security

博客园 - wj-conquer

Oracle数据库管理员面试题 dl, dt, dd标签的使用方法 新年到了, 写了几个网页祝福大家新年快乐, 万事如意 java根据自定义标记分割字符串 word2007中批量添加超链接的方法 如何使用freemarker将jsp网页静态化? jsp获取相对路径网址的方法 request.getContextPath() 百度广告联盟号被封 网站被降权 SQLServer如何取得随机获取的数据库记录 IE出问题,所有网页提示脚本错误 CSS使文章自动换行的问题 很精美的仿京东商城产品详细JS放大效果 JSP面试题及答案 四大方法提升百度联盟点击率 Java中随机数生成, Manth和Random的用法 在页面中显示系统当前时间,在页面中加载时间 Unable to load configuration. - bean struts-default.xml struts2中的jar包冲突 设置首页 加入收藏代码 百度搜索引擎的代码、百度搜索功能的码代
Java调用SQL Server存储过程同时返回参数和结果集
wj-conquer · 2010-07-11 · via 博客园 - wj-conquer

Java调用SQL Server存储过程同时返回参数和结果集

文章分类:Java编程

转自:http://blog.csdn.net/kirbylynx/archive/2008/12/09/3483449.aspx

比如SQL Server的一个存储过程:

create procedure proc_test 
@q_type int,
@value int,
@count int output
as
begin
     update mytable set value = @value where type = @q_type
     set @count = @@rowcount
     select * from mytable where type = @q_type
end
go
这个存储过程,既有输出参数,又有返回结果集,而用java调用他,两者都要取到,则代码如下:

Connection conn = MyConnectionPool.getConnection();
CallableStatement cstmt = conn.prepareCall("{call proc_test(?,?,?)}");
cstmt.setInt(1, type);
cstmt.setInt(2, value);
cstmt.registerOutParameter(3, java.sql.Types.INTEGER);
ResultSet rs = cstmt.executeQuery();
while(rs.next()) {
   doSomeThingToResultSet(rs);
}
doSomeThingToOutParameter(cstmt.getInt(3));
rs.close();
cstmt.close();
conn.close();
其中的关键在于哪儿呢?

必须用cstmt.executeQuery()来取得结果集,用cstmt.execute()然后getResultSet()是取不到的,而executeQuery()能保证先执行update再select;
获得输出参数的cstmt.getInt(3)必须在处理完结果集的所有内容后再执行,如果把上述代码改成如下:
........
doSomeThingToOutParameter(cstmt.getInt(3));
while(rs.next()) {
   doSomeThingToResultSet(rs);
}
........

       后果就是,在rs.next()的时候,会抛出异常:java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Object has been closed.

很有趣,不是么?


本文来自CSDN博客,http://blog.csdn.net/kirbylynx/archive/2008/12/09/3483449.aspx