前言:这是我在简书的第一篇文章,目前正在学习C#,还属于基础加强阶段,希望可以通过撰写博客加深自己对于所学知识点的理解,并尽量详细的把自己的学习过程与大家分享,希望能够与大家一起分享交流学习心得。

当我们从sql数据库中读取的数据量较多,并需要在页面中展示出来时,在一页上全部显示未免有点冗余,所以为了方便用户查看,可以实现分页浏览的功能,具体需求如下。

需求分析

从数据库读取数据显示在DataGridView中;

实现分页浏览,可以选择首页、尾页、上一页、下一页,并可由用户选择每页显示的数据条数

实现过程分析

在sql数据库中创建表TblTeacher

在vs中自定义SqlHelper类,将有关数据库的所有操作均封装进去,让用户在编程时只专注于构造sql语句或者存储过程;

设计WinForm窗体,向其中添加MenuStrip和DataGridView控件;

编写MenuStrip各项的点击事件。

1.实现效果

WinForm窗体每页显示3条数据效果图如下所示:

首页

尾页(最后一页条数不够3)

菜单栏设计

First表示首页;Last表示尾页;Prev表示前一页;Next表示后一页;最后一栏为combox,可由用户选择每页显示的数据条数

2.实现过程

创建表

创建表TblTeacher,表中包含tTId(编号)、tTName(姓名)、tTGender(性别)、tTAge(年龄)、tTSalary(薪资)、tTBirthday(生日)6个字段,其中tTId为主键。

表结构.png

封装SqlHelper类

应用程序配置文件中配置连接字符串

在使用数据库时,连接字符串需多次使用到,将其写进配置文件中后,在程序中只需通过一句代码就可访问到。在App.config中configuration节点下添加如下代码段:

方法封装

GetConn() 获取数据库连接,返回SqlConnection类型

ExecuteNonQuery(string sql) 执行sql语句,返回受影响的行数int类型

ExecuteNonQuery(string sql, CommandType type, params SqlParameter[] ps) 执行参数化的sql语句或者存储过程,返回受影响的行数int类型

ExecuteScalar(string sql, params SqlParameter[] ps) 执行参数化的sql语句,返回首行首列的值object类型

GetDataTable(string sql, Dictionary dic) 执行参数化的sql语句,返回DataTable类型的结果集

数据库操作流程

创建连接字符串

创建sql语句或者存储过程

创建sqlcommand或者sqldataadapter对象执行sql语句或存储过程

获取数据库的返回值

关闭数据库,释放资源

namespace 分页查询

{

public static class SqlHelper

{

///

/// 获取连接

///

/// 返回数据库连接

private static SqlConnection GetConn()

{

return new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["cl"].ConnectionString);

}

///

/// 获取受影响的行数,不带参数,执行sql语句

///

///

public static int ExecuteNonQuery(string sql)

{

return ExecuteNonQuery(sql, CommandType.Text, null);

}

///

/// 获取受影响的行数,带参数,选择执行的是存储过程还是普通的sql语句

///

///

///

///

public static int ExecuteNonQuery(string sql, CommandType type, params SqlParameter[] ps)

{

int rows = -1;

using (SqlConnection conn = GetConn())

{

SqlCommand cmd = new SqlCommand(sql, conn);

//定义执行语句的类型

cmd.CommandType = type;

if (ps != null)

cmd.Parameters.AddRange(ps);

conn.Open();

rows = cmd.ExecuteNonQuery();

}

return rows;

}

///

/// 获取首行首列的值

///

///

///

///

public static object ExecuteScalar(string sql, params SqlParameter[] ps)

{

object obj = null;

using (SqlConnection conn = GetConn())

{

SqlCommand cmd = new SqlCommand(sql, conn);

if (ps != null)

cmd.Parameters.AddRange(ps);

conn.Open();

obj = cmd.ExecuteScalar();

}

return obj;

}

///

/// 获取一个结果集

///

///

///

///

public static DataTable GetDataTable(string sql, Dictionary dic)

{

DataTable dt = new DataTable();

using (SqlConnection conn = GetConn())

{

SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);

if (dic != null)

{

SqlParameter[] ps = new SqlParameter[dic.Count];

int index = 0;

foreach (var item in dic)

{

ps[index++] = new SqlParameter(item.Key, item.Value);

}

adapter.SelectCommand.Parameters.AddRange(ps);

}

conn.Open();

adapter.Fill(dt);

}

return dt;

}

}

}

控件点击事件

菜单栏子项点击后的触发事件,通过Text属性判断当前要去第几页。

//填充数据到datagridview

private void fillToolStripMenuItem_Click(object sender, EventArgs e)

{

string sql = "select * from Teacher_Index";

DataTable dt = SqlHelper.GetDataTable(sql, null);

dataGridView1.DataSource = dt;

}

//当前显示的页码

int page_index;

//判断选择的是首页、尾页、前一页、后一页

private void Page_Click(object sender, EventArgs e)

{

//根据combox的内容获取一页的行数

int page_size = Convert.ToInt32(MS_page_size.Text);

//获取总的数据行数

int rows = GetCount();

//获取能得到的最多的页数

int max_rowindex = rows % page_size == 0 ? rows / page_size : rows / page_size + 1;

ToolStripMenuItem page = sender as ToolStripMenuItem;

switch (page.Text)

{

//首页

case "First":

page_index = 1;

break;

//尾页

case "Last":

page_index = max_rowindex;

break;

//前一页

case "Prev":

if (page_index <= 1)

//已经是首页

page_index = 1;

else

page_index--;

break;

//下一页

case "Next":

if (page_index >= max_rowindex)

//已经是尾页

page_index = max_rowindex;

else

page_index++;

break;

}

//指定dataGridView1的数据源

dataGridView1.DataSource = GetData();

}

//获取指定行的数据

private DataTable GetData()

{

int page_size = Convert.ToInt32(MS_page_size.Text);

//获取指定列数的内容

string sql = "select * from Teacher_Index where row_index between @startindex and @endindex";

//给参数赋值

Dictionary dic = new Dictionary();

dic.Add("@startindex", (page_size * (page_index - 1)+1).ToString());

dic.Add("@endindex", (page_size * page_index).ToString());

return SqlHelper.GetDataTable(sql, dic);

}

private void Form1_Load(object sender, EventArgs e)

{

//初始化显示第一页

page_index = 1;

//默认每页显示3行数据。因本次试验数据较少,所以选择每页显示3、4、5条数据

MS_page_size.SelectedIndex = 0;

}

//获取数据行数

private int GetCount()

{

int rows = 0;

//获取表的行数

string sql = "select COUNT(*) from Teacher_Index";

rows = Convert.ToInt32(SqlHelper.ExecuteScalar(sql, null));

return rows;

}

3.总结

至此,已可实现从数据库中读取数据并将其分页浏览,可由用户自定义选择每页显示的数据条数,方便查询。

c# mysql分页_c#-数据库分页查询相关推荐

  1. Oracle、MySql、SQLServer 数据库分页查询语句

    (一).** mysql的分页查询** mysql的分页查询是最简单的,借助关键字limit即可实现查询,查询语句通式: /* * sql:可以是单表的查询语句,也可以是多表的联合查询语句* firs ...

  2. mysql迭代查询并分页_mysql 数据库 分页查询优化

    举个栗子: 表名:batch_big_num 列名:id(主键),name,age,product_name,product_num 1,利用索引 (1)加一个order by+索引列   可以提升一 ...

  3. 【第二版】RichFaces中使用datatable和datascroller进行分页(使用数据库分页,改良版)(含源码)(JSF 1.2,RichFaces 3.2.1GA)

    之前第一版有个问题,就是如果进行了删除等操作并立即返回列表页,被删除的项还在那,但其实数据库已经被删除了,需要做一个刷新列表操作才可以,本版就是修正此问题的. 如果要修正此问题,就需要将分页的扩展代码 ...

  4. MySQL实验四数据库的查询_MySQL数据库查询(实验四)

    MySQL数据库查询 准备工作:脚本文件xkgl.sql下载:xkgl脚本.sql 1.执行脚本xkgl.sql (创建xkgl库.表及插入数据),观察有无错误,如有记录错误信息,并解决. (1) 执 ...

  5. c mysql 报表_c 数据库报表打印

    C# WinForm开发系列 - Print 收集了一些打印方面文章, 包含WinForm, Asp.Net中使用, 有结合Excel/Word, 也有直接使用报表工具打印功能, Web打印采用css ...

  6. MySQL实验四数据库的查询_MySQL数据库实验四:嵌套查询

    实验四          嵌套查询 一.实验目的 掌握SELECT语句的嵌套使用,实现表的复杂查询,进一步理解SELECT语句的高级使用方法. 二.实验环境 三.实验示例 1.  查询与"刘 ...

  7. Django数据库操作查询

    文章目录 Django数据库操纵查询 F和Q对象: 1.F对象: 2.Q对象: 2.聚合函数和排序函数 1.聚合函数: 2.排序函数: 3.级联查询: 1.关联查询 关联过滤查询 4.查询集 **查询 ...

  8. mysql查询01课程比02课程_小菜菜mysql练习解读分析2——查询存在 01 课程但可能不存在 02 课程的情况(不存在时显示为 null )...

    "查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null )" --翻译为:课程表里面,存在01的信息,未必满 ...

  9. Java web访问MySql数据库分页查询

    有时候我们查询数据库表时,但是很多时候表中的记录很多,需要显示出来的话怎么办?这时可以使用分页的方法,就是指定从数据库表的什么位置开始查询显示,以及指定显示的记录数目. Mysql数据库提供了limi ...

  10. 【mySQL】mysql数据库分页查询讨论专题

    目录 一.limit分页公式.总页数公式 1 limit分页公式 2 总页数公式 二 .Mysql的三种分页方法 1 limit m,n分页语句(低效) 2 limit m语句 (有局限) 三. 查询 ...

最新文章

  1. 进程和线程的区别与联系
  2. Alyona and a tree (树上倍增+差分)
  3. (三)数据结构之“栈”
  4. 关于Mysql java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)的问题...
  5. 装饰器3--装饰器作用原理
  6. php代码加文件后缀,php中一行代码获取文件后缀名
  7. ipsec *** 的总结性谈论
  8. 惊艳!小米折叠屏新机渲染图曝光:不输华为三星
  9. matlab2c使用c++实现matlab函数系列教程-sort函数
  10. Android CheckBox 实战
  11. 2022年6月TIOBE编程语言排名:Python、C、Java
  12. opencv Camshift
  13. 高等代数 线性空间(第8章)2 同构与商空间
  14. 腾讯是如何一刀刀,在15年间干死那些竞争对手的?! (zz)
  15. Android 自动检测版本更新(包含强制更新)并安装
  16. 怀旧服私聊显示服务器后缀,聊天窗口相关设置:有爱怀旧服聊天增强插件简易指南...
  17. Talib中文文档(二):Momentum Indicators 动量指标
  18. python将txt坐标批量打印到原图上
  19. 如何用C语言简单加密文件+
  20. Linux:系统进程---->查看命令【ps:静态查看进程】【top:动态查看进程】

热门文章

  1. 2000元台式电脑组装配置单2021 2000元组装电脑配置清单
  2. 如何统计网页的浏览量?Steins
  3. 二维数组/三维数组 定义
  4. 数据压缩算法该如何选择?
  5. java摄像头_Java实现 海康摄像头抓拍图像
  6. 计算机硬盘搜索记录,怎么清除Win7搜索记录 Win7搜索历史记录删除教程
  7. 关于idea链接oracle数据库出现IO 错误: Got minus one from a read call, connect lapse 1 ms., Authen
  8. 一文看懂马尔科夫过程
  9. 关于wps删除不了多余的空白页
  10. 京东联盟API接口-京东订单查询接口-实时掌握订单情况