2023年6月21日发(作者:)

C#-数据库分页查询前⾔:这是我写的第⼀篇技术⽂章,⽬前正在学习C#,还属于基础加强阶段,希望可以通过撰写博客加深⾃⼰对于所学知识点的理解,并尽量详细的把⾃⼰的学习过程与⼤家分享,希望能够与⼤家⼀起分享交流学习⼼得。当我们从sql数据库中读取的数据量较多,并需要在页⾯中展⽰出来时,在⼀页上全部显⽰未免有点冗余,所以为了⽅便⽤户查看,可以实现分页浏览的功能,具体需求如下。需求分析从数据库读取数据显⽰在DataGridView中选择显⽰⾸页、尾页、上⼀页、下⼀页实现过程分析在sql数据库中创建表TblTeacher在vs中⾃定义SqlHelper类,将有关数据库的所有操作均封装进去,让⽤户在编程时只专注于构造sql语句或者存储过程;设计WinForm窗体,向其中添加MenuStrip和DataGridView控件;编写MenuStrip各项的点击事件。1.实现效果WinForm窗体每页显⽰3条数据效果图如下所⽰:First表⽰⾸页;Last表⽰尾页;Prev表⽰前⼀页;Next表⽰后⼀页;最后⼀栏为combox,可由⽤户选择每页显⽰的数据条数2.实现过程创建表创建表TblTeacher,表中包含tTId(编号)、tTName(姓名)、tTGender(性别)、tTAge(年龄)、tTSalary(薪资)、tTBirthday(⽣⽇)6个字段,其中tTId为主键。封装SqlHelper类应⽤程序配置⽂件中配置连接字符串在使⽤数据库时,连接字符串需多次使⽤到,将其写进配置⽂件中后,在程序中只需通过⼀句代码就可访问到。在中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(tionStrings["cl"].ConnectionString); } /// /// 获取受影响的⾏数,不带参数,执⾏sql语句 /// /// public static int ExecuteNonQuery(string sql) { return ExecuteNonQuery(sql, , 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); //定义执⾏语句的类型 dType = type; if (ps != null) ge(ps); (); rows = eNonQuery(); } 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) ge(ps); (); obj = eScalar(); } 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[]; int index = 0; foreach (var item in dic) { ps[index++] = new SqlParameter(, ); } ge(ps); }

(); (dt); } return dt; } }}复制代码控件点击事件菜单栏⼦项点击后的触发事件,通过Text属性判断当前要去第⼏页。//填充数据到datagridview private void fillToolStripMenuItem_Click(object sender, EventArgs e) { string sql = "select * from Teacher_Index"; DataTable dt = aTable(sql, null); urce = dt; urce = dt; } //当前显⽰的页码 int page_index; //判断选择的是⾸页、尾页、前⼀页、后⼀页 private void Page_Click(object sender, EventArgs e) { //根据combox的内容获取⼀页的⾏数 int page_size = 32(MS_page_); //获取总的数据⾏数 int rows = GetCount(); //获取能得到的最多的页数 int max_rowindex = rows % page_size == 0 ? rows / page_size : rows / page_size + 1; ToolStripMenuItem page = sender as ToolStripMenuItem; switch () { //⾸页 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的数据源 urce = GetData(); } //获取指定⾏的数据 private DataTable GetData() { int page_size = 32(MS_page_); //获取指定列数的内容 string sql = "select * from Teacher_Index where row_index between @startindex and @endindex"; //给参数赋值 Dictionary dic = new Dictionary(); ("@startindex", (page_size * (page_index - 1)+1).ToString()); ("@endindex", (page_size * page_index).ToString()); return aTable(sql, dic); } private void Form1_Load(object sender, EventArgs e) { //初始化显⽰第⼀页 page_index = 1; //默认每页显⽰3⾏数据。因本次试验数据较少,所以选择每页显⽰3、4、5条数据 MS_page_edIndex = 0; MS_page_edIndex = 0; } //获取数据⾏数 private int GetCount() { int rows = 0; //获取表的⾏数 string sql = "select COUNT(*) from Teacher_Index"; rows = 32(eScalar(sql, null)); return rows; }复制代码3.总结⾄此,已可实现从数据库中读取数据并将其分页浏览,可由⽤户⾃定义选择每页显⽰的数据条数,⽅便查询。

2023年6月21日发(作者:)

C#-数据库分页查询前⾔:这是我写的第⼀篇技术⽂章,⽬前正在学习C#,还属于基础加强阶段,希望可以通过撰写博客加深⾃⼰对于所学知识点的理解,并尽量详细的把⾃⼰的学习过程与⼤家分享,希望能够与⼤家⼀起分享交流学习⼼得。当我们从sql数据库中读取的数据量较多,并需要在页⾯中展⽰出来时,在⼀页上全部显⽰未免有点冗余,所以为了⽅便⽤户查看,可以实现分页浏览的功能,具体需求如下。需求分析从数据库读取数据显⽰在DataGridView中选择显⽰⾸页、尾页、上⼀页、下⼀页实现过程分析在sql数据库中创建表TblTeacher在vs中⾃定义SqlHelper类,将有关数据库的所有操作均封装进去,让⽤户在编程时只专注于构造sql语句或者存储过程;设计WinForm窗体,向其中添加MenuStrip和DataGridView控件;编写MenuStrip各项的点击事件。1.实现效果WinForm窗体每页显⽰3条数据效果图如下所⽰:First表⽰⾸页;Last表⽰尾页;Prev表⽰前⼀页;Next表⽰后⼀页;最后⼀栏为combox,可由⽤户选择每页显⽰的数据条数2.实现过程创建表创建表TblTeacher,表中包含tTId(编号)、tTName(姓名)、tTGender(性别)、tTAge(年龄)、tTSalary(薪资)、tTBirthday(⽣⽇)6个字段,其中tTId为主键。封装SqlHelper类应⽤程序配置⽂件中配置连接字符串在使⽤数据库时,连接字符串需多次使⽤到,将其写进配置⽂件中后,在程序中只需通过⼀句代码就可访问到。在中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(tionStrings["cl"].ConnectionString); } /// /// 获取受影响的⾏数,不带参数,执⾏sql语句 /// /// public static int ExecuteNonQuery(string sql) { return ExecuteNonQuery(sql, , 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); //定义执⾏语句的类型 dType = type; if (ps != null) ge(ps); (); rows = eNonQuery(); } 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) ge(ps); (); obj = eScalar(); } 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[]; int index = 0; foreach (var item in dic) { ps[index++] = new SqlParameter(, ); } ge(ps); }

(); (dt); } return dt; } }}复制代码控件点击事件菜单栏⼦项点击后的触发事件,通过Text属性判断当前要去第⼏页。//填充数据到datagridview private void fillToolStripMenuItem_Click(object sender, EventArgs e) { string sql = "select * from Teacher_Index"; DataTable dt = aTable(sql, null); urce = dt; urce = dt; } //当前显⽰的页码 int page_index; //判断选择的是⾸页、尾页、前⼀页、后⼀页 private void Page_Click(object sender, EventArgs e) { //根据combox的内容获取⼀页的⾏数 int page_size = 32(MS_page_); //获取总的数据⾏数 int rows = GetCount(); //获取能得到的最多的页数 int max_rowindex = rows % page_size == 0 ? rows / page_size : rows / page_size + 1; ToolStripMenuItem page = sender as ToolStripMenuItem; switch () { //⾸页 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的数据源 urce = GetData(); } //获取指定⾏的数据 private DataTable GetData() { int page_size = 32(MS_page_); //获取指定列数的内容 string sql = "select * from Teacher_Index where row_index between @startindex and @endindex"; //给参数赋值 Dictionary dic = new Dictionary(); ("@startindex", (page_size * (page_index - 1)+1).ToString()); ("@endindex", (page_size * page_index).ToString()); return aTable(sql, dic); } private void Form1_Load(object sender, EventArgs e) { //初始化显⽰第⼀页 page_index = 1; //默认每页显⽰3⾏数据。因本次试验数据较少,所以选择每页显⽰3、4、5条数据 MS_page_edIndex = 0; MS_page_edIndex = 0; } //获取数据⾏数 private int GetCount() { int rows = 0; //获取表的⾏数 string sql = "select COUNT(*) from Teacher_Index"; rows = 32(eScalar(sql, null)); return rows; }复制代码3.总结⾄此,已可实现从数据库中读取数据并将其分页浏览,可由⽤户⾃定义选择每页显⽰的数据条数,⽅便查询。