C# WinForm数据库存储过程实现高效分页技术

3星 · 超过75%的资源 需积分: 49 32 下载量 46 浏览量 更新于2024-09-18 收藏 4KB TXT 举报
在开发C# WinForm应用程序时,经常会遇到需要展示大量数据的情况。一次性加载所有数据会导致内存占用过高,影响程序性能,甚至可能导致系统响应缓慢。为了解决这个问题,我们可以采用分页的方式来展示数据,使得用户可以逐步浏览,而不会一次性加载过多的数据。本篇将介绍如何利用C#和数据库存储过程来实现分页功能。 分页的关键在于每次只从数据库中获取一部分数据,而不是全部。这里我们使用SQL Server的存储过程来实现这个功能。首先,创建一个名为`PageCut`的存储过程,接收两个参数:`@pageSize`表示每页显示的记录数,`@pageIndex`表示当前页码。存储过程内部通过动态生成SQL语句来实现分页查询。 存储过程的具体代码如下: ```sql CREATE PROCEDURE dbo.PageCut ( @pageSize INT, -- 每页显示的记录数 @pageIndex INT -- 当前页码 ) AS SET NOCOUNT ON DECLARE @sqlStr VARCHAR(1000) SET @sqlStr = 'SELECT TOP ' + STR(@pageSize) + ' * FROM (SELECT TOP ' + STR(@pageIndex * @pageSize) + ' * FROM mainTable ORDER BY software) AS a ORDER BY software DESC' -- 示例SQL:SELECT TOP 5 * FROM (SELECT TOP 10 * FROM mainTable ORDER BY software) AS a ORDER BY software DESC -- 这里模拟第二页,每页5条,总共10条数据,第一轮取10条(第1-10条),然后第二轮取5条(第6-10条) EXEC (@sqlStr); RETURN ``` 存储过程的工作原理是先取出`@pageIndex * @pageSize`条数据,然后在这部分数据中选取`@pageSize`条,这样就实现了按指定页码和每页大小进行数据筛选。注意,这里的排序依据是`software`字段,你可以根据实际需求更改。 在C# WinForm程序中,我们需要调用这个存储过程并处理返回的结果。以下是一个简单的示例: ```csharp // 定义分页参数 private const int PAGESIZE = 5; // 每页记录数 private int PAGEINDEX = 1; // 当前页码 // 调用存储过程获取数据并填充到dataGridView public void CutPages() { // 创建SqlCommand对象,指定存储过程名称和连接 SqlCommand comm = new SqlCommand("PageCut", conn); comm.CommandType = CommandType.StoredProcedure; // 添加参数 SqlParameter para1 = new SqlParameter("@pageSize", SqlDbType.Int); SqlParameter para2 = new SqlParameter("@pageIndex", SqlDbType.Int); para1.Value = PAGESIZE; para2.Value = PAGEINDEX; comm.Parameters.Add(para1); comm.Parameters.Add(para2); // 创建数据集和SqlDataAdapter,填充数据 DataSet ds = new DataSet(); SqlDataAdapter da = new SqlDataAdapter(comm); da.Fill(ds, "mainTable"); // 将数据绑定到dataGridView控件 dataGridView1.DataSource = ds.Tables["mainTable"]; } ``` 在这个例子中,我们首先创建一个SqlCommand对象,设置其CommandType为StoredProcedure,然后添加两个参数,分别对应存储过程中的`@pageSize`和`@pageIndex`。接下来,创建一个SqlDataAdapter,用于填充数据集,最后将数据集的表格绑定到dataGridView控件,完成数据展示。 通过这样的方式,C# WinForm应用就能实现高效且资源友好的分页功能,避免一次性加载大量数据带来的问题。同时,这种方法也适用于其他支持存储过程的数据库系统,只需要调整相应的SQL语法即可。
2012-12-04 上传
再次声明 千万不要把XiaoQi.dll 跟 XiaoQi.XML 给分开 添加的时候 一定要引用 不要直接复制DLL 不然没有方法注释 最强大分分页控件 华丽的分页控件 实用的分页控件 有最新最实用的方法 联系小柒 下面是 AspNetHelp 类 方法概述 ///Show()弹出对话框 ///重载Show()弹出对话框 并且跳转界面 ///ShowJavascript()执行javascript脚本 ///FileDelete()给出文件虚拟路径删除文件 ///FileSize()获取上传文件大小 ///FileUpload()文件上传 路径upload/ 自动重命名 ///FileDownload()文件下载 调用方法如 FileDownload(Response,Server,文件虚拟路径) ///FileTxtWrite()写入TXT文本 给出要创建Txt 文本的地址 ///FileTxtReader()读取TXT文本 Txt 文本的地址 返回一个数组 每一行为数组里的一个元素 ///StringEncrypt() DES字符串加密中文不可以加密 ///StringDecrypt()DES解密字符串 ///StringMD5Encrypt()MD5加密 ///StringPYChar()单个汉字返回该汉字首字母 ///StringRandom()生成指定位数的随机数 ///StringEdit()给出指定字符串长度多少位后用点显示... ///StringReplaceSpace()替换文本中的空格和换行 ///StringColor()改变字的颜色 ///StringNull()当对象是空的时候 转为空字符串 ///StringConvert()汉字转拼音 ///StringNumber()数字转换中文 ///StringRep()url参数为中文时候转换加密 ///StringRes()url参数为中文时候转换解密 ///ShowWindowForm()弹出新窗口页面 ///ShowFormModalDialog()弹出模式窗口页面 ///SqlGetMaxID()给出表名列名 int类型 查询出最大列值+1 适用于主键 ///SqlGetSingle()执行一条计算查询结果语句,返回查询结果(object)。 ///SqlExecute()执行SQL语句,返回影响的记录数 ///SqlRunStr()执行SQL语句,不返回影响的记录数 ///SqlRunReturn()执行SQL语句,并返回第一行第一列结果 ///SqlGetReader()获得SqlDataReader对象 使用完须关闭DataReader,关闭数据库连接 ///SqlGetTable()执行查询语句,返回DataTable ///SqlDataSet()执行查询语句,返回DataSet ///SqlIsCunZai()执行Sql 语句查询是否有数据 如果没有返回假 ///SqlRunProc()执行存储过程 ///DataBindDropDownListDefault()DropDownList控件绑定 带默认选择项 如"请选择" ///DataBindDropDownList()DropDownList控件绑定 不带默认选择项 ///DataBindRadioButtonList()RadioButtonList控件绑定 默认第一个选中 ///DataBindCheckBoxList()CheckBoxList控件绑定 ///ElseIpAddr()调用此方法 返回当前登录的省市IP地址 ///ElseDataTimeIng()返回本地电脑的当前日期的年月日时分秒 动态的显示 JS实现 ///ElsePageLoad()页面加载数据加载完成呈现页面 ///ElseCkeck()返回页面验证码图片 使用方法:单独创建一个页面 在首次加载事件里写 AspNetHelp.ElseCkeck(Page); 在使用验证码的页面直接写 img src="这个页面的路径" 注意验证码保存在 Session["CheckCode"]中 这里是区分大小写的 ///ElseColorRGB()由于QQ截图的取色会出现RGB的颜色 这里能转换成16进制 分页控件详情请看内置文档