日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Java調(diào)用SQL Server存儲過程同時返回參數(shù)和結(jié)果集

 知識存儲館 2014-08-07

比如SQL Server的一個存儲過程:

 

  1. create procedure proc_test 
  2. @q_type int,
  3. @value int,
  4. @count int output
  5. as
  6. begin
  7.      update mytable set value = @value where type = @q_type
  8.      set @count = @@rowcount
  9.      select * from mytable where type = @q_type
  10. end
  11. go

這個存儲過程,既有輸出參數(shù),又有返回結(jié)果集,而用java調(diào)用他,兩者都要取到,則代碼如下:

 

  1. Connection conn = MyConnectionPool.getConnection();
  2. CallableStatement cstmt = conn.prepareCall("{call proc_test(?,?,?)}");
  3. cstmt.setInt(1, type);
  4. cstmt.setInt(2, value);
  5. cstmt.registerOutParameter(3, java.sql.Types.INTEGER);
  6. ResultSet rs = cstmt.executeQuery();
  7. while(rs.next()) {
  8.    doSomeThingToResultSet(rs);
  9. }
  10. doSomeThingToOutParameter(cstmt.getInt(3));
  11. rs.close();
  12. cstmt.close();
  13. conn.close();

其中的關(guān)鍵在于哪兒呢?

  1. 必須用cstmt.executeQuery()來取得結(jié)果集,用cstmt.execute()然后getResultSet()是取不到的,而executeQuery()能保證先執(zhí)行update再select;
  2. 獲得輸出參數(shù)的cstmt.getInt(3)必須在處理完結(jié)果集的所有內(nèi)容后再執(zhí)行,如果把上述代碼改成如下:

........
doSomeThingToOutParameter(cstmt.getInt(3));
while(rs.next()) {
   doSomeThingToResultSet(rs);
}
........

       后果就是,在rs.next()的時候,會拋出異常:java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Object has been closed.

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多