• 最通用的ibatis.Net使用sql server存储过程返回分页数据的详细例子


    ibatis.Net是一个比较简单和灵活的ORM框架,今天我分享一个我的项目中使用sql server通用存储过程来分页的一个例子,用ibatis.Net框架统一返回分页数据为IList<Hashtable>类型。下面是具体的代码步骤,你可以拿来直接用。

    1、ibatis.Net配置文件Common.xml

    1. <?xml version="1.0" encoding="utf-8" ?>
    2. <sqlMap namespace="Common" xmlns="http://ibatis.apache.org/mapping"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
    4. <alias>
    5. <typeAlias alias="PageCriteria" type="GM.Model.PageCriteria,GM.Model" />
    6. </alias>
    7. <parameterMaps>
    8. <parameterMap id="PageMap" class="PageCriteria">
    9. <parameter property="TableName" />
    10. <parameter property="PrimaryKey"/>
    11. <parameter property="Fields" />
    12. <parameter property="Condition" />
    13. <parameter property="CurrentPage" />
    14. <parameter property="PageSize" />
    15. <parameter property="Sort" />
    16. <parameter property="RecordCount" direction="Output" column="RecordCount"/>
    17. </parameterMap>
    18. </parameterMaps>
    19. <statements>
    20. <procedure id="GetPageData" parameterMap="PageMap" resultClass="Hashtable" >
    21. [dbo].[ProcGetPageData]
    22. </procedure>
    23. </statements>
    24. </sqlMap>

    2、通用分页存储过程ProcGetPageData

    1. CREATE PROCEDURE [dbo].[ProcGetPageData]
    2. ( @TableName VARCHAR(1000), --表名,多表是请使用 tA a inner join tB b On a.AID = b.AID
    3. @PrimaryKey NVARCHAR(100), --主键,可以带表头 a.AID
    4. @Fields NVARCHAR(2000) = '*',--读取字段
    5. @Condition NVARCHAR(3000) = '',--Where条件
    6. @CurrentPage INT = 1, --开始页码
    7. @PageSize INT = 10, --页大小
    8. @Sort NVARCHAR(200) = '', --排序字段
    9. @RecordCount INT = 0 OUT
    10. )
    11. AS
    12. DECLARE @strWhere VARCHAR(2000)
    13. DECLARE @strsql NVARCHAR(3900)
    14. IF @Condition IS NOT NULL AND len(ltrim(rtrim(@Condition)))>0
    15. BEGIN
    16. SET @strWhere = ' WHERE ' + @Condition + ' '
    17. END
    18. ELSE
    19. BEGIN
    20. SET @strWhere = ''
    21. END
    22. IF (charindex(ltrim(rtrim(@PrimaryKey)),@Sort)=0)
    23. BEGIN
    24. IF(@Sort='')
    25. SET @Sort = @PrimaryKey + ' DESC '
    26. ELSE
    27. SET @Sort = @Sort+ ' , '+@PrimaryKey + ' DESC '
    28. END
    29. SET @strsql = 'SELECT @RecordCount = Count(1) FROM ' + @TableName + @strWhere
    30. EXECUTE sp_executesql @strsql ,N'@RecordCount INT output',@RecordCount OUTPUT
    31. IF @CurrentPage = 1 --第一页提高性能
    32. BEGIN
    33. SET @strsql = 'SELECT TOP ' + str(@PageSize) +' '+@Fields
    34. + ' FROM ' + @TableName + ' ' + @strWhere + ' ORDER BY '+ @Sort
    35. END
    36. ELSE
    37. BEGIN
    38. /* 执行动态sql*/
    39. DECLARE @START_ID NVARCHAR(50)
    40. DECLARE @END_ID NVARCHAR(50)
    41. SET @START_ID = CONVERT(NVARCHAR(50),(@CurrentPage - 1) * @PageSize + 1)
    42. SET @END_ID = CONVERT(NVARCHAR(50),@CurrentPage * @PageSize)
    43. SET @strsql = ' SELECT *
    44. FROM (SELECT ROW_NUMBER() OVER(ORDER BY '+@Sort+') AS rownum,
    45. '+@Fields+ '
    46. FROM '+@TableName + @strWhere +') AS XX
    47. WHERE rownum BETWEEN '+@START_ID+' AND ' +@END_ID +' ORDER BY XX.rownum ASC'
    48. END
    49. EXEC(@strsql)
    50. RETURN
    51. GO
    这个一个sql server通用存储过程,可以用于任意单表和多表的分页查询。

    3、分页相关信息类PageCriteria

    1. public class PageCriteria
    2. {
    3. private string _TableName;
    4. public string TableName
    5. {
    6. get { return _TableName; }
    7. set { _TableName = value; }
    8. }
    9. private string _Fileds = "*";
    10. public string Fields
    11. {
    12. get { return _Fileds; }
    13. set { _Fileds = value; }
    14. }
    15. private string _PrimaryKey = "ID";
    16. public string PrimaryKey
    17. {
    18. get { return _PrimaryKey; }
    19. set { _PrimaryKey = value; }
    20. }
    21. private int _PageSize = 10;
    22. public int PageSize
    23. {
    24. get{return _PageSize;}
    25. set{_PageSize = value;}
    26. }
    27. private int _CurrentPage = 1;
    28. public int CurrentPage
    29. {
    30. get { return _CurrentPage; }
    31. set { _CurrentPage = value; }
    32. }
    33. private string _Sort = string.Empty;
    34. public string Sort
    35. {
    36. get { return _Sort; }
    37. set { _Sort = value; }
    38. }
    39. private string _Condition = string.Empty;
    40. public string Condition
    41. {
    42. get { return _Condition; }
    43. set { _Condition = value; }
    44. }
    45. private int _RecordCount;
    46. public int RecordCount
    47. {
    48. get { return _RecordCount; }
    49. set { _RecordCount = value; }
    50. }
    51. }
     
    这个类主要用于存储表名,页码页大小,记录总数,条件等等相关的信息。

    3、调用存储过程方法返回数据

    假设我有这样的一个表Person:
     

    1. public IList<Hashtable> GetListForPageSummary(PageCriteria criteria)
    2. {
    3. criteria.TableName ="Person";
    4. criteria.PrimaryKey = "Id";
    5. criteria.Fields = @"*";
    6. return Mapper.Instance().QueryForList<Hashtable>("GetPageData", criteria);
    7. }
    我这里的例子是在GetListForPageSummary方法里面对criteria进行赋值,你也可以在在外面先赋值好再传给GetListForPageSummary。你也可以根据你的需要对criteria的Condition动态赋值达到组合查询的效果,比如用户如果输入了值就加上条件,反之就不加。还有TableName也可以不止写一个表可以写成“Person a inner join Order b on a.Id=Order.UserID”这样的多个表关联(inner join,left join,right join都可以)查询。

    注意:Condition不用再加where关键词了。

    文章来源:http://www.lanhusoft.com/Article/97.html

  • 相关阅读:
    并发包学习(二)-容器学习记录
    初尝微信小程序开发与实践
    记一次全站升级https引发的一系列问题
    Hadoop集群搭建
    es5 的类和继承
    TypeScript 类和继承
    TypeScript 函数
    TypeScript 变量 和 数据类型
    js变量提升与函数提升
    vue 路由监听
  • 原文地址:https://www.cnblogs.com/lhyqzx/p/5112904.html
Copyright © 2020-2023  润新知