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(
"添加成功!");
}
可以简单的分析一下执行的过程:
- ExecuteNonQuery()方法根据参数不同将会首先重载#1-1,在#1-1中设置参数数组为null,既SqlHelper.ExecuteNonQuery(SqlHelper.connectionString, CommandType.Text, sql, (SqlParameter[])null)。
- 这时候ExecuteNonQuery()方法根据参数不同将会首先重载#1-2,在#1-2中重载#2-2方法执行查询。
- 在#2-2中首先要使用私有的PrepareCommand()方法把参数放入SqlCommand中,然后执行ADO.Net的ExecuteNonQuery()方法(这个是无参数的原始方法),执行成功则返回整数1。
- 剩下的就是一些判断和输出的过程了。
也可以自己写一些别的方法验证其他重载方法的时候,在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(
"执行无参数存储过程成功");
}
其他方法都是类似的,这个类中我们常用的方法如下:
- ExecuteNonQuery(): 执行简单的无返回值的查询。
- ExecuteDataset(): 返回Dataset的查询,相当于返回一个数组。
- ExecuteReader(): 使用DataReader读取数据。(注:少量数据的情况下使用SqlDataReader的效率高于使用Dataset)
- 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.html和http://imfei.blog.51cto.com,转载请注明出处。