一返回多个数据集
检查你的访问数据库的代码看是否存在着要返回多次的请求每次往返降低了你的应用程序的每秒能够响应请求的次数通过在单个数据库请求中返回多个结果集可以减少与数据库通信的时间使你的系统具有扩展性也可以减少数据库服务器响应请求的工作量
如果你是用动态的SQL语句来返回多个数据集那我建议你用存储过程来替代动态的SQL语句是否把业务逻辑写到存储过程中这个有点争议但是我认为把业务逻辑写到存储过程里面可以限制返回结果集的大小减小网络数据的流量在逻辑层也不用在过滤数据这是一个好事情
用SqlCommand对象的ExecuteReader方法返回一个强类型的业务对象再调用NextResult方法来移动数据集指针来定位数据集示例一演示了一个返回多个ArrayList强类型对象的例子只从数据库中返回你需要的数据可以大大的减小你的服务器所耗用的内存
// read the first resultset
reader = commandExecuteReader();
// read the data from that resultset
while (readerRead()) {
suppliersAdd(PopulateSupplierFromIDataReader( reader ));
}
// read the next resultset
readerNextResult();
// read the data from that second resultset
while (readerRead()) {
productsAdd(PopulateProductFromIDataReader( reader ));
}
二对数据进行分页
ASPNET的DataGrid有一个非常有用的功能分页如果DataGrid允许分页在某一时刻它只下载某一页的数据另外它有一个数据分页的济览导航栏它让你可以选择浏览某一页而且每次只下载一页的数据
但是它有一个小小的缺点就是你必须把所有的数据都绑定到DataGrid中也就是说你的数据层必须返回所有的数据然后DataGrid再根据当前页过滤出当前页所需要的数据显示出来如果有一个一万条记录的结果集要用DataGrid进行分页假设DataGrid每页只显示条数据那就意味着每次请求都有条数据都是要丢弃的每次请求都要返回这么大的数据集对应用程序的性能影响是非常大的
一个好的解决方案是写一个分页的存储过程例子是一个用于对Northwind数据库orders表的分页存储过程你只需要传当前页码每页显示的条数两个参数进来存储过程会返回相应的结果
在服务器端我专门写了一个分页的控件来处理数据的分页在这里我用了第一个方法在一个存储过程里面返回了两个结果集数据记录总数和要求的结果集
返回的记录总数取决于要执行查询例如一个where条件可以限制返回的结果集的大小因为在分页界面中必须要根据数据集记录的大小来计算总的页数所以必须要返回结果集的记录数例如如果一共有条记录如果用where条件就可以过滤成只返回条记录存储过程的分页逻辑应该知道返回那些需要显示的数据
Paging Through the Orders Table
CREATE PROCEDURE northwind_OrdersPaged
(
@PageIndex int
@PageSize int
)
AS
BEGIN
DECLARE @PageLowerBound int
DECLARE @PageUpperBound int
DECLARE @RowsToReturn int
First set the rowcount
SET @RowsToReturn = @PageSize * (@PageIndex + )
SET ROWCOUNT @RowsToReturn
Set the page bounds
SET @PageLowerBound = @PageSize * @PageIndex
SET @PageUpperBound = @PageLowerBound + @PageSize +
Create a temp table to store the select results
CREATE TABLE #PageIndex
(
IndexId int IDENTITY ( ) NOT NULL
OrderID int
)
Insert into the temp table
INSERT INTO #PageIndex (OrderID)
SELECT
OrderID
FROM
Orders
ORDER BY
OrderID DESC
Return total count
SELECT COUNT(OrderID) FROM Orders
Return paged results
SELECT
O*
FROM
Orders O
#PageIndex PageIndex
WHERE
OOrderID = PageIndexOrderID AND
PageIndexIndexID > @PageLowerBound AND
PageIndexIndexID < @PageUpperBound
ORDER BY
PageIndexIndexID
END
[] [] []