微软SqlHelper类中文注释和使用方法

时间:2021-04-15 08:46:26

SqlHelper.cs是N年前微软出品的一个使用ADO.Net方法对SQL Server数据库进行操作的封装类,随后有高人根据这个类写了DbHelper.cs以操作SQL Server之外的数据库,而后微软也发布了Enterprise Library企业库组件。但是对于刚开始学习ADO.Net/C#或者中小企业应用层面来说,根据SqlHelper.cs类做简单的数据库访问层的东西已经足够用了。Enterprise Library企业库虽然十分的强大,但是入手和配置都不是那么简单,杀鸡完全不用宰牛刀。

其实这个很古老的类还有一个很值得学习的地方:C#中重载的使用。每个查询数据库的方法都有8个左右的重载方法,对C#面向对象思想中的多态性不了解的,看过这些个重载方法基本上都会清清楚楚了。此外应该注意的是public sealed class SqlHelper{}:sealed修饰符修饰的类是封闭的类,是不能被继承的。

和微软发布的SqlHelper.cs不同,为了方便我把里面的SqlHelperParameterCatch.cs单独列出来了。下面的下载中还有OledbHelper.cs、OdbcHelper.cs和XMLHelper.cs可供使用,分别针对不同的数据库类型。下面略微解析一下SqlHelper.cs这个类的使用方法,其中类内部使用的私有方法不再介绍,因为公共方法的使用大同小异,所以就以最简单的ExecuteNonQuery()方法作为范例。

ASP.NET/C#语言: //#1-1
public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText){}
//#1-2
public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters){}
//#1-3
public static int ExecuteNonQuery(string connectionString, string spName, params object[] parameterValues){}


//#2-1
public static int ExecuteNonQuery(SqlConnection connection, CommandType commandType, string commandText){}
//#2-2
public static int ExecuteNonQuery(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters){}
//#2-3
public static int ExecuteNonQuery(SqlConnection connection, string spName, params object[] parameterValues){}

//#3-1
public static int ExecuteNonQuery(SqlTransaction transaction, CommandType commandType, string commandText){}
//#3-2
public static int ExecuteNonQuery(SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] commandParameters){}
//#3-3
public static int ExecuteNonQuery(SqlTransaction transaction, string spName, params object[] parameterValues){}

上述代码是ExecuteNonQuery()的9个重载方法,其中前3个算是准备查询,中间3个是执行查询,后面3个则是用于SQL事物查询。再细分,#2-1执行的是无参数的SQL语句,而#2-2执行的是包含参数数组的SQL语句(参数数组可以为空),#2-3执行的则是无返回值的存储过程。实际上,#1-1和#1-3重载是为了方便无参数的SQL语句,而#1-3和#2-3重载只是为了方便调用存储过程,他们的本质还是和#1-2和#2-2一样。下面是针对重载方法的一些简单使用。

1. ExecuteNonQuery()执行无参数的SQL语句。
ASP.NET/C#语言: string sql = "INSERT INTO Customer(Country,Firstname,Lastname) VALUES('USA','Steven','Sun')";
if (SqlHelper.ExecuteNonQuery(SqlHelper.connectionString, CommandType.Text, sql) == 1)
{
    Response.Write("添加成功!");
}

可以简单的分析一下执行的过程:

  1. ExecuteNonQuery()方法根据参数不同将会首先重载#1-1,在#1-1中设置参数数组为null,既SqlHelper.ExecuteNonQuery(SqlHelper.connectionString, CommandType.Text, sql, (SqlParameter[])null)。
  2. 这时候ExecuteNonQuery()方法根据参数不同将会首先重载#1-2,在#1-2中重载#2-2方法执行查询。
  3. 在#2-2中首先要使用私有的PrepareCommand()方法把参数放入SqlCommand中,然后执行ADO.Net的ExecuteNonQuery()方法(这个是无参数的原始方法),执行成功则返回整数1。
  4. 剩下的就是一些判断和输出的过程了。

也可以自己写一些别的方法验证其他重载方法的时候,在Visual Studio中按F11可以逐语句的查看执行的过程,下面两个方法的使用也是一样的,所以就只贴代码了。

2. ExecuteNonQuery()执行有参数数组的SQL语句。
ASP.NET/C#语言: //修改指定CustomerId的顾客的国籍
string sql = "UPDATE Customer SET Country=@Country WHERE CustomerId=@CustomerId";
SqlParameter[] param = new SqlParameter[]
{
    new SqlParameter("@Version", SqlDbType.VarChar),
    new SqlParameter("@CustomerId", SqlDbType.Int)
};
param[0].Value = "England";
param[1].Value = 5;
if (SqlHelper.ExecuteNonQuery(SqlHelper.connectionString, CommandType.Text, sql, param) == 1)
{
    Response.Write("修改成功!");
}
3. ExecuteNonQuery()执行无返回值的存储过程。
SQL Server语言: CREATE PROCEDURE [dbo].[SP_ExecuteNonQuery]
AS
BEGIN
INSERT INTO Customer VALUES('Japan','Beautiful','Girl')
END
ASP.NET/C#语言: if (SqlHelper.ExecuteNonQuery(SqlHelper.connectionString, "SP_ExecuteNonQuery") == 1)
{
     Response.Write("执行无参数存储过程成功");
}

其他方法都是类似的,这个类中我们常用的方法如下:

  1. ExecuteNonQuery(): 执行简单的无返回值的查询。
  2. ExecuteDataset(): 返回Dataset的查询,相当于返回一个数组。
  3. ExecuteReader(): 使用DataReader读取数据。(注:少量数据的情况下使用SqlDataReader的效率高于使用Dataset)
  4. ExecuteScalar(): 返回结果集中的第一行第一列,相当于返回单个值。

其他的方法使用的较少,就不介绍了。强烈建议使用Visual Studio 2010调试这些程序,下面是这几个类的下载地址,如有问题,欢迎和我一起探讨。

1. SqlHelper.cs详细中文注释:http://www.feiyan.info/upload/SqlHelper.cs.pdf

2. SqlHelper类库:http://www.feiyan.info/upload/SqlHelper.rar

注:本文发布于http://www.feiyan.info/416.htmlhttp://imfei.blog.51cto.com,转载请注明出处。

本文出自 “一个人飞” 博客,请务必保留此出处http://imfei.blog.51cto.com/1849649/496822