关于SqlHelper的详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于SqlHelper的详解相关的知识,希望对你有一定的参考价值。

    SqlHelper是一个基于.NET Framework的数据库操作组件。组件中包含数据库操作方法。SqlHelper用于简化你重复的去写那些数据库连接(SqlConnection),SqlCommand,SqlDataReader等等。SqlHelper 封装过后通常是只需要给方法传入一些参数如数据库连接字符串,SQL参数等,就可以访问数据库了,很方便。

sqlhelper是C#中abstract抽象类的典型应用

简介

SqlHelper是一个基于.NET Framework的数据库操作组件。组件中包含数据库操作方法,SqlHelper有很多版本,主要以微软一开始发布的SqlHelper类,后面包含进了Enterprise Library开源包中了。还有一个主要版本是dbhelper.org开源的sqlhelper组件,优点是简洁,高性能,不仅仅支持sqlserver,同时支持sqlserver、oracle、access、mysql数据库,也是一个开源项目,提供免费下载。
SqlHelper用于简化你重复的去写那些数据库连接(SqlConnection),SqlCommand,SqlDataReader等等。SqlHelper 封装过后通常是只需要给方法传入一些参数如数据库连接字符串,SQL参数等,就可以访问数据库了,很方便。
SqlHelper 类用于通过一组静态方法来封装数据访问功能。该类不能被继承或实例化,因此将其声明为包含专用构造函数的不可继承类。在 SqlHelper 类中实现的每种方法都提供了一组一致的重载。这提供了一种很好的使用 SqlHelper 类来执行命令的模式,同时为开发人员选择访问数据的方式提供了必要的灵活性。每种方法的重载都支持不同的方法参数,因此开发人员可以确定传递连接、事务和参数信息的方式。
 

配置项


在应用SqlHelper前最好使用web.config配置连接字符串,这样有利于网站的可移植性和代码的简洁。
<connectionStrings>
<!--SqlServerHelper连接字符串设定-->
<add connectionString="server=.;uid=sa;pwd=123456;database=yourdatabase" name="SqlServerHelper"/>
<!--Oracle连接字符串设定-->
<add connectionString="Data Source=orcl;User Id=system;Password=***;Integrated Security=no" name="OracleHelper"/>
<!--MySql连接字符串设定-->
<add connectionString="server=localhost;uid=root;pwd=123456;database=mysqldatabase" name="MySqlHelper"/>
</connectionStrings>
<!--access连接字符串设定-->
<add connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=F:\mdbFilePath\db.mdb;Jet OLEDB:Database Password=123" name="MySqlHelper"/>
</connectionStrings>

  

技术分享
<appSettings>
    <add key="" value="">
</appSettings>
View Code

源码


编写SqlHelper调用代码:
SqlHelper支持多种数据库包括MySql、SqlServer、Oracle、Access数据库,如果数据库是SqlServer,那么你可以使用SqlServerHelper类,如果是MySql,可以使用MySqlHelper,如果是Access,可以使用AccessHelper。如果是Oracle则可以使用OracleHelper类。
SqlHelper的书写风格很多,你可以选择自己的需求和爱好使用静态方式或对象方式。各种利弊。选择情况使用吧!
 

静态方式

静态方式也是目前应用最多的一种,因为其简单,所以在写一个Sql语句时,用一个方法就可以搞定。如果一个过程需要多个Sql语句执行时,得创建SqlConnection和控制他的传参,使语句复杂。或者就是每执行一个sql语句让SqlConnection创建一次,使性能受到影响。但是在只执行一个简单的查询语句时,显的更简单,所以这种方式在简单的执行逻辑面前,受到大家的喜爱!
 
//查询语句执行:
DataTable dt=SqlServerHelper.ReadTable("select * from table1");
//插入语句执行:
SqlServerHelper.ExecuteNonQuery("insert into [students] values(@student_name,@class“),
SqlServerHelper.CreateInputParameter("@student_name", SqlDbType.NVarChar, 100, txt_student_name_sqlserver.Text),
SqlServerHelper.CreateInputParameter("@class", SqlDbType.NVarChar, 100, txt_class_sqlserver.Text)
);

  

对象式编程

其实这种语法也不复杂,只是加个using语句而己:
 
技术分享
1 using (SqlServerHelper helper = new SqlServerHelper())
2 {
3 helper.Command.CommandText = "delete from [Students] where [email protected]";
4 helper.AddParameter("@stid", SqlDbType. Int, student_id);
5 helper.Open();
6 helper.ExecuteNoneQuery();
7 helper.Command.Parameters.Clear();
8 helper.Command.CommandText = "select * from [Students]";return helper.ReadTable();
9 }
View Code
这是官方示例代码中的一部分,语法简单,在一个using语句中执行了delete删除语句和select查语句。
比如,如果你想执行事务时,可以使用:
技术分享
 1 using (SqlServerHelper helper = new SqlServerHelper())
 2 {
 3 helper.Command.CommandText = "delete from [Students] where [email protected]";
 4 helper.AddParameter("@stid", SqlDbType. Int, student_id);
 5 helper.Open();
 6 DbTransaction tran = helper.Connection.BeginTransaction();
 7 helper.Command.Transaction=tran;
 8 try
 9 {
10 helper.ExecuteNoneQuery();
11 tran.Rollback();
12 }
13 catch { tran.Rollback(); throw; }
14 }
View Code

成员


在 SqlHelper 类中实现的方法包括:
ExecuteNonQuery。此方法用于执行不返回任何行或值的命令。这些命令通常用于执行数据库更新,但也可用于返回存储过程的输出参数。
ExecuteReader。此方法用于返回SqlDataReader对象,该对象包含由某一命令返回的结果集
ExecuteDataset。此方法返回DataSet对象,该对象包含由某一命令返回的结果集。
ExecuteScalar。此方法返回一个值。该值始终是该命令返回的第一行的第一列。
ExecuteXmlReader。此方法返回 FOR XML 查询的 XML 片段。
除了这些公共方法外,SqlHelper 类还包含一些专用函数,用于管理参数和准备要执行的命令。不管客户端调用什么样的方法实现,所有命令都通过 SqlCommand 对象来执行。在 SqlCommand 对象能够被执行之前,所有参数都必须添加到 Parameters 集合中,并且必须正确设置 Connection、CommandType、CommandText 和 Transaction 属性。SqlHelper 类中的专用函数主要用于提供一种一致的方式,以便向 SQL Server 数据库发出命令,而不考虑客户端应用程序调用的重载方法实现。SqlHelper 类中的专用实用程序函数包括:
AttachParameters:该函数用于将所有必要的 SqlParameter 对象连接到正在运行的 SqlCommand。
AssignParameterValues:该函数用于为 SqlParameter 对象赋值。
PrepareCommand:该函数用于对命令的属性(如连接、事务环境等)进行初始化。
ExecuteReader:此专用 ExecuteReader 实现用于通过适当的 CommandBehavior 打开SqlDataReader对象,以便最有效地管理与阅读器关联的连接的有效期。
 

注意

1、如果使用SqlHelper方法调用数据库存储过程,需要获取存储过程的返回值,请使用带有SqlParameter[]参数的方法,Object[]参数的方法无法获取存储过程返回值
 

源程序

技术分享
  1 (中文注释)
  2 /// <summary>
  3 /// 自定义访问通用类
  4 /// </summary>
  5 public class SqlDbHelper
  6 {
  7 string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["conn"].ConnectionString;
  8 /// <summary>
  9 ///构造函数
 10 /// </summary>
 11 public SqlDbHelper()
 12 {
 13 }
 14 /// <summary>
 15 /// ExecuteNonQuery操作,对数据库进行 增、删、改 操作((1)
 16 /// </summary>
 17 /// <param name="sql">要执行的SQL语句 </param>
 18 /// <returns> </returns>
 19 public int ExecuteNonQuery(string sql)
 20 {
 21 return ExecuteNonQuery(sql, CommandType.Text, null);
 22 }
 23 /// <summary>
 24 /// ExecuteNonQuery操作,对数据库进行 增、删、改 操作(2)
 25 /// </summary>
 26 /// <param name="commandType">要执行的查询类型(存储过程、SQL文本) </param>
 27 /// <returns> </returns>
 28 public int ExecuteNonQuery(string sql, CommandType commandType)
 29 {
 30 return ExecuteNonQuery(sql, commandType, null);
 31 }
 32 /// <summary>
 33 /// ExecuteNonQuery操作,对数据库进行 增、删、改 操作(3)
 34 /// </summary>
 35 /// <param name="parameters">参数数组 </param>
 36 /// <returns> </returns>
 37 public int ExecuteNonQuery(string sql, CommandType commandType,params SqlParameter[] parameters)
 38 {
 39 int count = 0;
 40 {
 41 using (SqlCommand command = new SqlCommand(sql, connection))
 42 {
 43 command.CommandType = commandType;
 44 if (parameters != null)
 45 {
 46 foreach (SqlParameter parameter in parameters)
 47 {
 48 command.Parameters.Add(parameter);
 49 }
 50 }
 51 connection.Open();
 52 count = command.ExecuteNonQuery();
 53 }
 54 }
 55 return count;
 56 }
 57 /// <summary>
 58 /// SqlDataAdapter的Fill方法查询,并返回一个DataSet类型结果(1)
 59 /// </summary>
 60 /// <returns> </returns>
 61 {
 62 return ExecuteDataSet(sql, CommandType.Text, null);
 63 }
 64 /// <summary>
 65 /// SqlDataAdapter的Fill 方法 执行一 查询,并返回一个DataSet类型结果(2)
 66 /// </summary>
 67 /// <returns> </returns>
 68 {
 69 return ExecuteDataSet(sql, commandType, null);
 70 }
 71 /// <summary>
 72 /// SqlDataAdapter的Fill方法执行查询,并返回一个DataSet类型结果(3)
 73 /// </summary>
 74 /// <returns> </returns>
 75 public DataSet ExecuteDataSet(string sql, CommandType commandType, SqlParameter[] parameters)
 76 {
 77 DataSet ds = new DataSet();
 78 {
 79 using (SqlCommand command = new SqlCommand(sql, connection))
 80 {
 81 command.CommandType = commandType;
 82 if (parameters != null)
 83 {
 84 foreach (SqlParameter parameter in parameters)
 85 {
 86 command.Parameters.Add(parameter);
 87 }
 88 }
 89 SqlDataAdapter adapter = new SqlDataAdapter(command);
 90 adapter.Fill(ds);
 91 }
 92 }
 93 return ds;
 94 }
 95 /// <summary>
 96 /// SqlDataAdapter的Fill方法执行个查询,并返回一个DataTable类型结果(1)
 97 /// </summary>
 98 /// <returns> </returns>
 99 public DataTable ExecuteDataTable(string sql)
100 {
101 return ExecuteDataTable(sql, CommandType.Text, null);
102 }
103 /// <summary>
104 /// SqlDataAdapter的Fil执行一个查询,并返回一个DataTable类型结果(2)
105 /// </summary>
106 /// <returns> </returns>
107 public DataTable ExecuteDataTable (string sql, CommandType commandType)
108 {
109 return ExecuteDataTable(sql, commandType, null);
110 }
111 /// <summary>
112 /// SqlDataAdapter的Fill方法,执行一个查询,并返回一个DataTable类型结果(3)
113 /// </summary>
114 /// <returns> </returns>
115 public DataTable ExecuteDataTable(string sql, CommandType commandType, SqlParameter[] parameters)
116 {
117 DataTable data = new DataTable();
118 using (SqlConnection connection = new SqlConnection(connectionString))
119 {
120 using (SqlCommand command = new SqlCommand(sql, connection))
121 {
122 command.CommandType = commandType;
123 if (parameters != null)
124 {
125 foreach (SqlParameter parameter in parameters)
126 {
127 command.Parameters.Add(parameter);
128 }
129 }
130 adapter.Fill(data);
131 }
132 }
133 return data;
134 }
135 /// <summary>
136 /// ExecuteReader执行一查询,返回一SqlDataReader对象实例(1)
137 /// </summary>
138 /// <returns> </returns>
139 public SqlDataReaderExecuteReader (string sql)
140 {
141 return ExecuteReader(sql, CommandType.Text, null);
142 }
143 /// <summary>
144 /// ExecuteReader执行一查询,返回一SqlDataReader对象实例(2)
145 /// </summary>
146 /// <returns> </returns>
147 publicSqlDataReader ExecuteReader(string sql, CommandType commandType)
148 {
149 return ExecuteReader(sql, commandType, null);
150 }
151 /// <summary>
152 /// ExecuteReader执行一查询,返回一SqlDataReader对象实例(3)
153 /// </summary>
154 /// <returns> </returns>
155 publicSqlDataReader ExecuteReader( string sql, CommandType commandType, SqlParameter[] parameters)
156 {
157 SqlConnection connection = new SqlConnection(connectionString);
158 SqlCommand command = new SqlCommand(sql, connection);
159 command.CommandType = commandType;
160 if (parameters != null)
161 {
162 foreach (SqlParameter parameter in parameters)
163 {
164 command.Parameters.Add(parameter);
165 }
166 }
167 connection.Open();
168 return command.ExecuteReader(CommandBehavior.CloseConnection);
169 }
170 /// <summary>
171 /// ExecuteScalar执行一查询,返回查询结果的第一行第一列(1)
172 /// </summary>
173 /// <returns> </returns>
174 public Object ExecuteScalar(string sql)
175 {
176 return ExecuteScalar(sql, CommandType.Text, null);
177 }
178 /// <summary>
179 /// ExecuteScalar执行一查询,返回查询结果的第一行第一列(2)
180 /// </summary>
181 /// <returns> </returns>
182 public Object ExecuteScalar( string sql, CommandType commandType)
183 {
184 return ExecuteScalar(sql, commandType, null);
185 }
186 /// <summary>
187 /// ExecuteScalar执行一查询,返回查询结果的第一行第一列(3)
188 /// </summary>
189 /// <returns> </returns>
190 {
191 object result = null;
192 {
193 using (SqlCommand command = new SqlCommand(sql, connection))
194 {
195 command.CommandType = commandType;
196 if (parameters != null)
197 {
198 foreach (SqlParameter parameter in parameters)
199 {
200 command.Parameters.Add(parameter);
201 }
202 }
203 connection.Open();
204 result = command.ExecuteScalar();
205 }
206 }
207 return result;
208 }
209 /// <summary>
210 /// 返回当前连接的数据库中所有由用户创建的数据库
211 /// </summary>
212 /// <returns> </returns>
213 public DataTable GetTables()
214 {
215 DataTable data = null;
216 {
217 connection.Open();
218 data = connection.GetSchema("Tables");
219 }
220 return data;
221 }
222 }
View Code

 

 

以上是关于关于SqlHelper的详解的主要内容,如果未能解决你的问题,请参考以下文章

SqlHelper——仅仅由于在人群中多看了你一眼

C#实现较为实用的SQLhelper

SQLHelper助手

(转) Java中的负数及基本类型的转型详解

关于代码片段的时间复杂度

2016-11-2坚持学习Day17微软 推出的SQLHelper