asp.net 操作带输入输出参数的分页存储过程(—)

以前做项目,大部分做的是普通的项目,普通的代码,普通的编程模式。数据库操作基本是采用SQL语句的形式,先不说运行效率如何,至少维护,修改相当麻烦。


最近开始向asp.net的三层架构,MVC以及存储过程方面发展。在写一个通用的分页模块的时候,本能的利用了一下百度。搜索结果关于“存储过程,分页,asp.net“的代码一大把,复制了几个分页存储过程测试,发现没有几个能测试通过,有些并没有良好的注释,有的没有调用代码。让人无从下手。感慨之余,自已写了相关的代码。

  1. 以下是带输入输出参数的分页存储过程,该存储过程仅支持单表分页操作。

CREATE PROCEDURE [dbo].[GetNewsList]  ----存储过程名称
@curpage varchar(8),               ----输入参数curpage 当前页码,可以用Request.QueryString["page']方式接收过来的。
@pagesize varchar(8),              ----输入参数pagesize 每页记录数,可以程序中自行定义
@prikey varchar(8),                ----输入参数主键,索引键或唯一列 如:id
@tabname varchar(32),              -----输入参数,数据表名,如: news
@fldname varchar(64),              -----输入参数,字段列表,返回在的记录集中包含的字段如:id,cid,title
@condition varchar(64),            -----输入参数,筛选条件,如:id<1 and title='a' 注意不要加where 关键字
@sortname varchar(64),             ------输入参数,排序字段,如:[updatetimes] asc,id desc,注意不要加order by
@recordcount varchar(16) output    -----输出参数,记录总数。
as
declare @csql varchar(1000)        -------定义sql语名拼接变量
begin
set @csql='select top ' + cast(@pagesize as varchar) + ' ' + @fldname + '  from ['+ @tabname + ']'     
if @condition=' '
set @csql=@csql + ' where 1=1 '
else
set @csql=@csql + ' where ' + @condition 
end 
begin
if @curpage>1
begin
set @csql=@csql + ' and ' + @prikey + ' not in (select top ' + cast(((@curpage-1) * @pagesize) as varchar) + ' ' + @prikey + '  from [' + @tabname + '] '
if @condition=' '
set @csql=@csql + ' where 1=1 '
else
set @csql=@csql + ' where '  + @condition 
if @sortname=' '
set @csql=@csql + ' order by ' + @prikey + ' asc)'
else
set @csql=@csql + ' order by ' + @sortname + ' , ' + @prikey + ' asc)'
end
end 
execute (@csql)                    -----------------执行sql拼接后的语句,返回根据输入参数确定的记录
begin
declare @tsql nvarchar(128)
set @tsql='select   @recordcount =count(' + @prikey + ')  from [' + @tabname + ']'
if @condition=' '
set @tsql=@tsql + ' where 1=1 '
else
set @tsql=@tsql + ' where '  + @condition 
execute sp_executesql @tsql,N'@recordcount varchar output',@recordcount output  -------------------返回输出参数记录总数。
end
GO
  1. C#代码 对应三层结构的数据层。
/// <summary>
/// 针对存储过程的自定义分页功能
/// </summary>
/// <param name="SqlCommandText">存储过程名称</param>
/// <param name="pagesize">每页记录条数</param>
/// <param name="pagecount">页总数</param>
/// <param name="recordcount">记录总数</param>
/// <param name="SQLParameters">存储过程参数</param>
/// <returns></returns>
public static DataTable ExecuteReader(string SqlCommandText,int pagesize , ref int pagecount, ref int recordcount, params  IDbDataParameter[] SQLParameters)
{
    DataTable dt = null;
    IDbConnection conn = null;
    IDataReader reader = null;
    SqlCommand cmd = null;
    recordcount = -1;
    pagecount = -1;
    try
     {
         conn = new SqlConnection(dboString);  ///初始化连接
         cmd = new SqlCommand();///初始化命令对象
         PrepareCommand(conn, cmd, SqlCommandText, SQLParameters);   ///对传入的sql命令进行预处理
         reader = cmd.ExecuteReader();
          dt = DataReaderToDataTable(reader);  ///将DataReader对象转换成DataTable
          reader.Close();///关闭DataReader对象,注意,在这里如果不先关闭对象,输出参数将无法获取
          recordcount = Convert.ToInt32(cmd.Parameters["recordcount"].Value);    ///获取输出参数,记录总数
          pagecount = Convert.ToInt32((recordcount % pagesize > 0) ? (recordcount / pagesize + 1) : (recordcount / pagesize));   ///根据记录总和传入的页记录数计算页总数                             
      }
      catch (Exception ex)
      {
          CustomErrors.ErrFlag = "database";
          CustomErrors.ErrDescription = ex.Message + "dd";
      }
      finally { DBConnClose(conn); }
      return dt;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值