前言:

SqlHelper是一个基于.NETFrameWork的数据库操作组件,组件中包含操作数据库的各种方法,他封装的目的无疑是简化重复写的数据库连接,当SqlHelper封装以后,只需要给方法传入一些参数,就可以实现对数据库的访问。

SqlHelper类通过一组静态的方法来封装数据访问功能,不能被继承和实例化。SqlHelper 类中实现的每种方法的重载,每种方法的重载都支持不同的方法参数,开发人员可确定传递、连接、事物和参数,也使得选择访问数据的方式变得更加灵活。

例子

学习SqlHelper前,我们来学习一下操作数据库的类有哪些?

1.构造接收数据的结合  2.连接  3.命令  4.适配器  5.DataReader  6.DataSet.DataTable

我们将一个某数据表中的数据显示到form窗体中的dataGridView控件中

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Data.SqlClient;namespace userInfo
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){ //操作数据库的类有哪些//  //0.构造接收数据的集合://  //1.连接  Connection-- - SqliteConnection//  //2.命令 Command//  //3.适配器  DataAdapter//  //4.DataReader//  //5.DataSet.DateTableList<UserInfo> list = new List<UserInfo>(); //0构造接收数据的集合//1.将数据表ManagerInfo 中数据显示到DataGridview中string connStr = @"server=Jason\SQLEXPRESS;uid=sa;pwd=123456;database=charge_sys";//2.创建连接对象using (SqlConnection conn = new SqlConnection(connStr)){//3.创建Command连接对象SqlCommand cmd = new SqlCommand("select * from User_Info", conn);//4.打开链接conn.Open();//5.执行命令SqlDataReader reader = cmd.ExecuteReader();//6.读取if (reader.HasRows){while (reader.Read())//判断是否存在数据{list.Add(new UserInfo(){userID = reader["UserId"].ToString(),PWD = reader["Pwd"].ToString(),Level = reader["Level"].ToString(),UserName = reader["UserName"].ToString(),Head = reader["Head"].ToString()});}}dataGridView1.DataSource = list; //7.数据显示到DataGridView上conn.Close();}           }}
}

SqlHelper的封装

如果存在多个界面对数据库进行操作,我们是不是一直重复写对数据操作的类,为了方便,我们对SqlHeIper进行封装。

1.添加一个配置文件(APPConfig):用于连接数据库,配置文件的存在无疑是我们可以随意更改自己连接的数据库,可见它不可进行封装,也就无法封装在SQLHelper里面。

<?xml version="1.0" encoding="utf-8" ?>
<configuration><startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /></startup><connectionStrings><add name="ConStr" connectionString="server=Jason\SQLEXPRESS;uid=sa;pwd=123456;database=ChargingSystem"/></connectionStrings>
</configuration>

2.实现SqlHelper 的封装

步骤:

1.定义一个静态的连接字符串,并且读取字符串

2. ExecuteNonQuery(); : 执行命令的方法:insert update delete,返回值类型为int型。多用于执行增加,删除,修改数据,返回受影响的行数。当select操作时,返回-1。
  方法返回值意义:对于执行命令的成功的返回值为该命令所影响的行数,如果影响的行数为0时返回的值为0,

3.ExecuteScaler(); 获取首行首列的方法:执行select查询,返回值类型多位int类型。得到的返回结果为一个值的情况,比如使用count函数求表中记录个数或者使用sum函数求和等。
ExecuteScalar()方法也用来执行SQL语句,但是ExecuteScalar()执行SQL语句后的返回值与ExecuteNonQuery()并不相同,
ExecuteScalar()方法的返回值的数据类型是Object类型。
如果执行的SQL语句是一个查询语句(SELECT),则返回结果是查询后的第一行的第一列,
如果执行的SQL语句不是一个查询语句,则会返回一个未实例化的对象,必须通过类型转换来显示,

4. DataTable ();获取结果结果集

5.ExecuteReader(); :用于查询操作。返回类型为SqlDataReader。SqlDataReader对象的Read();方法进行逐行读取。
其中的读取数据列的时候。除了使用reder["列名"].ToString();还可以使用reder[索引].ToSting();<注意:这里的索引指的是数据库中列的索引。从0开始。

using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;namespace DAL
{public class SqlHelper{//从配置文件中读取连接字符串private static string connStr = ConfigurationManager.ConnectionStrings["sql"].ConnectionString;//1.ExecuteNonQuery(); : //执行命令的方法:insert update delete//它的返回值类型为int型。多用于执行增加,删除,修改数据,返回受影响的行数。当select操作时,返回-1。//ExecuteNonQuery()方法主要用户更新数据,通常它使用Update,Insert,Delete语句来操作数据库,//其方法返回值意义:对于 Update, Insert, Delete 语句 执行成功是返回值为该命令所影响的行数,如果影响的行数为0时返回的值为0,//params是关键字:是可变参数的意思,目的是省略手动构造数组的过程,直接指定对象编译器会帮助我们构造数组,并将对象加入数组中传递过来public static int ExcuteNonQuery(string sql, params SqlParameter[] paras){using (SqlConnection conn = new SqlConnection(connStr))//创建连接对象{SqlCommand cmd = new SqlCommand(sql, conn);  //创建Command连接对象cmd.Parameters.AddRange(paras);//添加参数conn.Open();//打开链接int n = cmd.ExecuteNonQuery(); //执行命令并返回受影响的行数  cmd.Parameters.Clear();return n;}}//ExecuteScaler(); 获取首行首列的方法//它的返回值类型多位int类型。它返回的多为执行select查询。得到的返回结果为一个值的情况,比如使用count函数求表中记录个数或者使用sum函数求和等。//ExecuteScalar()方法也用来执行SQL语句,但是ExecuteScalar()执行SQL语句后的返回值与ExecuteNonQuery()并不相同,//ExecuteScalar()方法的返回值的数据类型是Object类型。//如果执行的SQL语句是一个查询语句(SELECT),则返回结果是查询后的第一行的第一列,//如果执行的SQL语句不是一个查询语句,则会返回一个未实例化的对象,必须通过类型转换来显示,public static Object ExecuteScalar(string sql, params SqlParameter[] paras){using (SqlConnection conn = new SqlConnection(connStr))//创建连接对象{SqlCommand cmd = new SqlCommand(sql, conn);  //创建Command连接对象cmd.Parameters.AddRange(paras);//添加参数conn.Open();//打开链接object o = cmd.ExecuteScalar(); //执行命令,获取查询结构中的首行首列的值  cmd.Parameters.Clear();return o;}}//获取结果结果集public static DataTable GetDataTable(string sql, params SqlParameter[] paras){using (SqlConnection conn = new SqlConnection(connStr))//创建连接对象{SqlDataAdapter adapter = new SqlDataAdapter(sql, conn); //创建适配器对象DataTable dt = new DataTable();//构造数据表用于接收查询结果adapter.SelectCommand.Parameters.AddRange(paras);//添加参数adapter.Fill(dt);//执行结果,fill方法内部自动打开链接,不需要conn.open();   adapter.SelectCommand.Parameters.Clear();//清空集合return dt; //返回结果集        }}}
}

上面的SqlHelper无法调用存储过程,此时我们需要在每一方法中加入参数CommandType type

参数CommandType type放在可变参数paras之前

 cmd.CommandType = type;


using System.Configuration;
using System.Data;
using System.Data.SqlClient;namespace winFormUI
{public  class SqlHelper{private static readonly string connStr = ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString;public static DataTable GetDataTable(string sql, CommandType type, params SqlParameter[] paras){using (SqlConnection conn = new SqlConnection(connStr))//创建连接对象{//创建适配器对象using (SqlDataAdapter adapter = new SqlDataAdapter(sql, conn)){if (paras != null){adapter.SelectCommand.Parameters.AddRange(paras);//添加参数}adapter.SelectCommand.CommandType = type;DataTable dt = new DataTable();//构造数据表用于接收查询结果                   adapter.Fill(dt);//执行结果,fill方法内部自动打开链接,不需要conn.open();   adapter.SelectCommand.Parameters.Clear();//清空集合return dt; //返回结果集       }}}public static int ExcuteNonQuery(string sql, CommandType type, params SqlParameter[] paras){using (SqlConnection conn = new SqlConnection(connStr))//创建连接对象{using (SqlCommand cmd = new SqlCommand(sql, conn)) //创建Command连接对象{if (paras != null){cmd.Parameters.AddRange(paras);//添加参数}cmd.CommandType = type;conn.Open();//打开链接 int n = cmd.ExecuteNonQuery(); //执行命令并返回受影响的行数  cmd.Parameters.Clear();return n;}}}public static object ExecuteScalar(string sql, CommandType type, params SqlParameter[] paras){using (SqlConnection conn = new SqlConnection(connStr))//创建连接对象{using (SqlCommand cmd = new SqlCommand(sql, conn)) //创建Command连接对象{if (paras != null){cmd.Parameters.AddRange(paras);//添加参数}cmd.CommandType = type;conn.Open();//打开链接                    return cmd.ExecuteScalar(); ;}}}}
}

关于SqlHelper的封装我就先介绍到这里,希望自己的总结对大家能有所帮助,大家一定要记得点赞哦。

SqlHelper的封装相关推荐

  1. 重构之SqlHelper

    重构之SqlHelper 在重构中,D层中有很多的类,其中很多都需要跟数据库打交道,就是所谓的增删改查,这些命令的执行就都是重复性的,仅仅是查询内容和数据表不同,就是所谓的查询参数和查询数据库的语句不 ...

  2. 基于ASP.NET的在线论坛系统开发

    一.前言 本系统开发语言为C#,数据库为SQL Server,开发环境为VS2010.主要功能是为用户提供了一个发布信息和讨论问题的平台,用户分为三个级别,对应不同的操作权限.基础操作为浏览.发表.删 ...

  3. 待毕业.Net码农就业求职储备

     声明:本文题目来源于互联网,仅供即将从学校毕业的.Net码农(当然,我本人也是菜逼一个)学习之用.当然,学习了这些题目不一定会拿到offer,但是针对就业求职做些针对性的准备也是不错的.此外,除 ...

  4. ADO.NET封装的SqlHelper

    参照别人的方法,顺便再次复习下ADO.NET的相关知识.为自己的类库做准备. namespace Common.SqlHelper {/// <summary>/// ADO.NET--- ...

  5. 一步步写自己SqlHelper类库(五):Command对象

    1.Command对象基础 当我们使用Connection对象里面的方法打开数据库后,要查询自己所需的数据或对数据库的内容进行增删改时,Command对象就派上用场了! MSDN定义:建立与数据源的连 ...

  6. JAVA入门到精通-第73讲-学生管理系统5-dao.sqlhelper

    -Model2模式 如果数据模型会很多,怎么办? 处理业务逻辑的:Model层 后台又分为:处理业务逻辑和对数据库的操作DAO-data access object -决定,再抽象一层出来:数据模型: ...

  7. 利用SqlHelper.cs实现Web程序对数据库的增、删、改等操作

    利用SqlHelper.cs实现Web程序对数据库的增.删.改等操作 (2006-08-22 00:50:05) 转载▼ 分类:技术杂谈 在SqlHelper.cs中,封装了所有和SQL数据库相关的操 ...

  8. 轻轻的我走了,正如我轻轻的来…——ADO.NET核心类的灭度与SQLHelper的诞生——十八相送(下)...

    源代码:13033480群共享 ADO.NET的SqlServer.NET数据提供程序,核心的类有4个,而在这个订餐系统中,我们只使用了3个,SqlConnection.SqlCommand.SqlD ...

  9. SqlHelper++

    using System; using System.Collections.Generic; using System.Configuration; using System.Data; using ...

  10. C# SQL封装(一)

    感谢软谋徐老师的SQLHelper.as , 代码如下(本人有所改动): using System; using System.Collections; using System.Collection ...

最新文章

  1. RDKit | RDKit(2019.09)新增相似性图函数
  2. 云路由 vyatta 体验(二)NAT
  3. opencv-python 视频处理之时光倒流
  4. [LGP4707] 重返现世
  5. 分享一张理解数据库inner join,left join,right join,full join的图
  6. 判断resultset是否遍历到最后一条记录_干货:一条SQL语句执行得很慢的原因
  7. java把一段英文拆成单词_java编程题,输入一段英文文章,单词之间都已经用空格分隔,本人想以每5个单词为一行输出,怎么写?请指教...
  8. python boxplot用法_Boxplot的介绍和使用
  9. html5 osgb,一份价值****元的Smart3d(Context Capture)和大疆智图(DJI Terra)建模评测...
  10. java 枚举 类 enum
  11. latex中文简历,硕博士找工作实习用,顶级简约简历
  12. Matlab画图线型、符号及颜色汇总
  13. html网页中wmode,关于html:Quicktime-Wmode透明问题
  14. cαr怎么发音_英文字母在线发音
  15. 计算机平面设计主要学什么 - 兔课网,兔课网:初学平面要怎么样构图?
  16. 统计学cv值是什么意思_什么是CV值
  17. oppo便签误删怎么办_OPPO手机便签删除了怎么恢复?有无需登录云端就可以恢复的备忘录软件吗...
  18. 如何看待 Java 大厂 P6+ 这一岗位能力要求?
  19. android 手动连接wifi,android手动连接wifi的过程
  20. 哈工大2020数据结构期末

热门文章

  1. 我的第一个游戏FoodieThebug完成之后的心得体会 -子龙山人
  2. java音乐播放器脚本之家,HTML5音乐播放器skPlayer
  3. java索引越界异常_索引越界异常java
  4. 适用于Windows的Xcode:在PC上安装Xcode的5种方法
  5. 计算机cmd管理员,cmd获取管理员权限的命令是什么
  6. ESXi6.7修改静态ip地址
  7. 如何得到JavaVM,JNIEnv接口
  8. 关于ExtJS错误“例外被抛出且未被接住”问题
  9. ldDWR出现“例外被抛出且未被接住 解决方法
  10. 海康威视设计:标准的数据中心机房设计图集DWG,70张图纸