软件下载 | 资讯教程 | 最近更新 | 下载排行 | 一键转帖 | 发布投稿
您的位置:最火下载站 > 网络编程 > ASP教程 > SQL存储过程分页以及.NET调用

SQL存储过程分页以及.NET调用

存储过程:

create proc Test
@PageIndex INT,--@PageIndex从计数,0为第一页
@PageSize INT, --页面大小
@RecordCount INT OUT, --总记录数
@PageCount INT OUT--页数
as
SELECT @RecordCount = COUNT(*) FROM A --获取记录数
SET @PageCount = CEILING(@RecordCount * 1.0 / @PageSize) --计算页面数据
SELECT SerialNumber,Id,Names,Age FROM
(SELECT Id,Names,Age,ROW_NUMBER() OVER (ORDER BY Id ) AS SerialNumber FROM A ) AS T
WHERE T.SerialNumber > (@PageIndex * @PageSize) and T.SerialNumber <= ((@PageIndex+1) * @PageSize)
go

存储过程测试:
DECLARE @RecordCount int ,@PageCount int
exec Test 0,10, @RecordCount OUTPUT, @PageCount OUTPUT
select @RecordCount,@PageCount
go

在开发中我们经常需要调用存储过程,执行更新、查询等命令。微软的.net2003自带的示例程序duwamish7架构精良,书写规范,可以说是我们学习的典范。很多程序代码中都有它的影子。不过我觉得就存储过程调用来说,应该还有改进的余地。duwamish7中存储过程的调用方式如下:

//先申明一个参数集合
SqlParameterCollection sqlParams = tmpInsertCommand.Parameters;

//然后往参数集中加入存储过程的参数,
sqlParams.Add(new SqlParameter("@PKId", SqlDbType.Int)).Direction = ParameterDirection.Output;
sqlParams.Add(new SqlParameter("@CustomerId", SqlDbType.Int));
sqlParams.Add(new SqlParameter("@Status", SqlDbType.Int));
sqlParams.Add(new SqlParameter("@OrderDate", SqlDbType.DateTime)); sqlParams.Add(new SqlParameter("@ShippingHandling", SqlDbType.Money)); sqlParams.Add(new SqlParameter("@ShipToName", SqlDbType.NVarChar, 40)); sqlParams.Add(new SqlParameter("@Address", SqlDbType.NVarChar, 255)); sqlParams.Add(new SqlParameter("@Country", SqlDbType.NVarChar, 40)); sqlParams.Add(new SqlParameter("@QuantityList", SqlDbType.NVarChar, 4000)); sqlParams.Add(new SqlParameter("@PriceList", SqlDbType.NVarChar, 4000));

//调用存储过程
SqlHelper.ExecuteNonQuery(ApplicationConfiguration.ConnectionString,CommandType.StoredProcedure,procedure.ProcedureName,sqlParams );

如上这种方法,调用起来很麻烦,特别是往参数集中加入参数这一步,需要跟存储过程的参数一个一个的比对,很麻烦又容易出错,有时候因为参数长度搞错了,导致程序运行不正确,查错会变得非常困难。有没有种更好更智能的方法呢?答案是肯定的。

一.解决思路
我们知道,存储过程是数据库的一个对象,我们能在系统表sysobjests中获取存储过程的相关信息。能在系统表syscolumn表中获取该存储过程对应的参数信息(参数名,长度,类型等)。有了这些信息,我们就一定能找到一种自动化的方式实现存储过程调用。
在这里,我通过C#提供的代码生成器做了一个存储过程类生成器。它的功能大体如下:首先创建一个存储过程父类和一个工具类,在该父类中包括一些通用的方法和属性。然后为每个存储过程创建一个类(这个类中包括存储过程的名称,参数信息等),继承存储过程父类,生成一个类文件。最后把这些存储过程类统一编译成一个存储过程类。

相关阅读
栏目导航
推荐软件