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()方法作为范例。
下述代码是ExecuteNonQuery()的9个重载方法。
前3个算是准备查询。
//#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){}
中间3个是执行查询。
//#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个则是用于SQL事物查询。
//#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){}
再细分,
//#2-1
public static int ExecuteNonQuery(SqlConnection connection, CommandType commandType,
string commandText){}
执行的是无参数的SQL语句,而
//#2-2
public static int ExecuteNonQuery(SqlConnection connection, CommandType commandType,
string commandText, params SqlParameter[] commandParameters){}
执行的是包含参数数组的SQL语句(参数数组可以为空)。
//#2-3
public static int ExecuteNonQuery(SqlConnection connection, string spName,
params object[] parameterValues){}
执行的则是无返回值的存储过程。
实际上,#1-1和#1-3
//#1-1
public static int ExecuteNonQuery(string connectionString, CommandType commandType,
string commandText){}
//#1-3
public static int ExecuteNonQuery(string connectionString, string spName,
params object[] parameterValues){}
重载是为了方便无参数的SQL语句。
而#1-3和#2-3
//#1-3
public static int ExecuteNonQuery(string connectionString, string spName,
params object[] parameterValues){}
//#2-3
public static int ExecuteNonQuery(SqlConnection connection, string spName,
params object[] parameterValues){}
重载只是为了方便调用存储过程,他们的本质还是和#1-2和#2-2
//#1-2
public static int ExecuteNonQuery(string connectionString, CommandType commandType,
string commandText,
params SqlParameter[] commandParameters){}
//#2-2
public static int ExecuteNonQuery(SqlConnection connection, CommandType commandType,
string commandText,
params SqlParameter[] commandParameters){}
一样。下面是针对重载方法的一些简单使用。
1. ExecuteNonQuery()执行无参数的SQL语句。
string sql = "INSERT INTO Customer(Country,Firstname,Lastname) VALUES('USA','Steven','Sun')";
if (SqlHelper.ExecuteNonQuery(SqlHelper.connectionString, CommandType.Text, sql) == 1)
{
Response.Write("添加成功!");
}
可以简单的分析一下执行的过程:
- ExecuteNonQuery()方法根据参数不同将会首先重载#1-1,
在#1-1中设置参数数组为null,既//#1-1 public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText){}
SqlHelper.ExecuteNonQuery(SqlHelper.connectionString, CommandType.Text, sql,
(SqlParameter[])null)。
- 这时候ExecuteNonQuery()方法根据参数不同将会首先重载#1-2,
//#1-2 public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters){}
- 在#1-2中重载#2-2方法执行查询。
在#2-2中首先要使用私有的PrepareCommand()方法把参数放入SqlCommand中,然后执行ADO.Net的ExecuteNonQuery()方法(这个是无参数的原始方法),执行成功则返回整数1。//#2-2 public static int ExecuteNonQuery(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters){}
- 剩下的就是一些判断和输出的过程了。
也可以自己写一些别的方法验证其他重载方法的时候,在Visual Studio中按F11可以逐语句的查看执行的过程,下面两个方法的使用也是一样的,所以就只贴代码了。
2. ExecuteNonQuery()执行有参数数组的SQL语句。
//修改指定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()执行无返回值的存储过程。
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("执行无参数存储过程成功");
}
其他方法都是类似的,这个类中我们常用的方法如下:
- ExecuteNonQuery(): 执行简单的无返回值的查询。
- ExecuteDataset(): 返回Dataset的查询,相当于返回一个数组。
- ExecuteReader(): 使用DataReader读取数据。(注:少量数据的情况下使用SqlDataReader的效率高于使用Dataset)
- ExecuteScalar(): 返回结果集中的第一行第一列,相当于返回单个值。
其他的方法使用的较少,就不介绍了。强烈建议使用Visual Studio 2010调试这些程序,下面是这几个类的下载地址,如有问题,欢迎和我一起探讨。
在原文的基础上稍有改动。
参考自:“一个人飞”博客。