谈谈Java调用SQL Server分页存储过程

本文主要谈谈Java调用SQL Server分页存储的过程,其返回是多个结果集,只要呈现形式是代码,文字不多,简单易懂。

SQL存储过程:

  1. USE [Db_8za8za_2]     
  2. GO     
  3.     
  4. SET ANSI_NULLS ON     
  5. GO     
  6. SET QUOTED_IDENTIFIER ON     
  7. GO     
  8. -- =============================================     
  9. -- Description:    <Description,,通用分页存储过程>     
  10. -- =============================================     
  11. ALTER PROCEDURE [dbo].[paging ]     
  12.     -- Add the parameters for the stored procedure here     
  13.     --传入参数     
  14.     @SqlStr nvarchar(4000), --查询字符串     
  15.     @CurrentPage int--第N页(当前页数)     
  16.     @PageSize int --每页行数     
  17. AS     
  18. BEGIN     
  19.     -- SET NOCOUNT ON added to prevent extra result sets from     
  20.     -- interfering with SELECT statements.     
  21.     SET NOCOUNT ON;     
  22.     --定义变量     
  23.     DECLARE @CursorId int --CursorId是游标的id     
  24.     DECLARE @Rowcount int --总记录(行)数     
  25.     DECLARE @pageCount int --总页数     
  26.     -- Insert statements for procedure here     
  27.         
  28.     EXEC sp_cursoropen @CursorId output,@SqlStr,     
  29.         @Scrollopt=1,@Ccopt=1,@Rowcount=@Rowcount OUTPUT     
  30.         
  31.     SET @pageCount=CEILING(1.0*@Rowcount/@PageSize)--设置总页数     
  32.         
  33.     SELECT @pageCount     
  34.         AS 总页数,@Rowcount AS 总行数,@CurrentPage AS 当前页 --提示页数     
  35.     
  36.     IF(@CurrentPage>@pageCount)--如果传入的当前页码大入总页码数则把当前页数设为***一页     
  37.         BEGIN     
  38.             SET @CurrentPage = @pageCount--设置当前页码数     
  39.         END     
  40.     IF(@CurrentPage<=0)--如果传入的当前页码大入总页码数则把当前页数设为***页     
  41.         BEGIN     
  42.             SET @CurrentPage = 1--设置当前页码数     
  43.         END     
  44.     SET @CurrentPage=(@CurrentPage-1)*@PageSize+1 --设置当前页码数     
  45.     
  46.     EXEC sp_cursorfetch @CursorId,16,@CurrentPage,@PageSize     
  47.     EXEC sp_cursorclose @CursorId    --关闭游标     
  48.     
  49.     SET NOCOUNT OFF     
  50. END   

#p#

Java调用储存过程:

  1. package test;    
  2.     
  3. import java.sql.*;    
  4.     
  5. public class Study3 {    
  6.     private Connection con;    
  7.     public ResultSet rs;    
  8.     private CallableStatement callsta;    
  9.     private String use = "sa";    
  10.     private String pwd = "sa";    
  11.     
  12.     public Study3() {    
  13.         try {    
  14.             // 连接数据库驱动    
  15.             Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");    
  16.             String str = "jdbc:microsoft:sqlserver://localhost:1433;databasename=test";    
  17.             con = DriverManager.getConnection(str, use, pwd);    
  18.     
  19.             // 设置存储过程参数    
  20.             String st = "{call Paging(?,?,?)}";    
  21.             callsta = con.prepareCall(st);    
  22.             callsta.setString(1"select * from T_employee");    
  23.             callsta.setInt(21);    
  24.             callsta.setInt(33);    
  25.     
  26.             // 循环输出调用存储过程的记录结果    
  27.             StringBuffer sb=new StringBuffer();    
  28.             int rsNum=0;//统计结果集的数量    
  29.             int updateCount = -1;    
  30.             boolean flag = callsta.execute();// 这个而尔值只说明***个返回内容是更新计数还是结果集。    
  31.             do {    
  32.                 updateCount = callsta.getUpdateCount();    
  33.                 if (updateCount != -1) {// 说明当前行是一个更新计数    
  34.                     // 处理.    
  35.                     System.out.println("..说明当前行是一个更新计数..");    
  36.                     callsta.getMoreResults();    
  37.                     continue;// 已经是更新计数了,处理完成后应该移动到下一行    
  38.                     // 不再判断是否是ResultSet    
  39.                 }    
  40.                 rs = callsta.getResultSet();    
  41.                 if (rs != null) {// 如果到了这里,说明updateCount == -1    
  42.                     // 处理rs    
  43.                     rsNum++;    
  44.                     System.out.println("统计结果集的数量:"+rsNum);    
  45.                     if (rs != null) {    
  46.                         ResultSetMetaData rsmd = rs.getMetaData(); // 获取字段名    
  47.                         int numberOfColumns = rsmd.getColumnCount(); // 获取字段数    
  48.                         int i = 0;    
  49.                         while (rs.next()) { // 将查询结果取出    
  50.                             for (i = 1; i <= numberOfColumns; i++) {    
  51. //                              System.out.println(rs.getInt("总页数"));    
  52.                                 String date = rs.getString(i);    
  53.                                 sb.append(date+" ");    
  54.                             }    
  55.                         }    
  56.                         rs.close();    
  57.                     }    
  58.                     callsta.getMoreResults();    
  59.                     continue;    
  60.                     // 是结果集,处理完成后应该移动到下一行    
  61.                 }    
  62.                 // 如果到了这里,说明updateCount == -1 && rs == null,什么也没的了    
  63.                 System.out.println(sb.toString());    
  64.             } while (!(updateCount == -1 && rs == null));    
  65.             // callsta.getXXX(int);//获取输出参数    
  66.         } catch (Exception e) {    
  67.             e.printStackTrace();    
  68.         }    
  69.     }    
  70.     
  71.     public static void main(String[] age) {    
  72.         Study3 study = new Study3();    
  73.     }    
  74. }   

原文链接:http://chenyunhong.iteye.com/blog/1096195

【编辑推荐】

  1. 说说Top子句对查询计划的影响
  2. SQL Server复灾 你懂了吗?
  3. SQL Server管理 这些你懂吗?
  4. 用一句SQL解决SQL中断号问题
  5. 如何用Java操作MongoDB

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/229019.html<

(0)
管理的头像管理
上一篇2025-04-18 14:01
下一篇 2025-04-18 14:03

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注