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

来源:互联网 发布:苹果电脑装机软件 编辑:程序博客网 时间:2024/06/08 07:38

以前做项目,大部分做的是普通的项目,普通的代码,普通的编程模式。数据库操作基本是采用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    -----输出参数,记录总数。asdeclare @csql varchar(1000)        -------定义sql语名拼接变量beginset @csql='select top ' + cast(@pagesize as varchar) + ' ' + @fldname + '  from ['+ @tabname + ']'     if @condition=' 'set @csql=@csql + ' where 1=1 'elseset @csql=@csql + ' where ' + @condition end beginif @curpage>1beginset @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 'elseset @csql=@csql + ' where '  + @condition if @sortname=' 'set @csql=@csql + ' order by ' + @prikey + ' asc)'elseset @csql=@csql + ' order by ' + @sortname + ' , ' + @prikey + ' asc)'endend execute (@csql)                    -----------------执行sql拼接后的语句,返回根据输入参数确定的记录begindeclare @tsql nvarchar(128)set @tsql='select   @recordcount =count(' + @prikey + ')  from [' + @tabname + ']'if @condition=' 'set @tsql=@tsql + ' where 1=1 'elseset @tsql=@tsql + ' where '  + @condition execute sp_executesql @tsql,N'@recordcount varchar output',@recordcount output  -------------------返回输出参数记录总数。endGO
  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 0
原创粉丝点击