一、思维导图
二、知识点描述
SqlHelper用于简化重复的去写那些数据库连接(SqlConnection),SqlCommand,SqlDataReader等等的代码。SqlHelper 封装过后通常是只需要给方法传入一些参数如数据库连接字符串,SQL参数等,就可以访问数据库。SqlHelper 类用于通过一组静态方法来封装数据访问功能。该类不能被继承或实例化,因此将其声明为包含专用构造函数的不可继承类。
在 SqlHelper 类中实现的方法包括:
ExecuteNonQuery:此方法用于执行不返回任何行或值的命令。这些命令通常用于执行数据库更新,但也可用于返回存储过程的输出参数。
ExecuteReader:此方法用于返回SqlDataReader对象,该对象包含由某一命令返回的结果集。
ExecuteDataset:此方法返回DataSet对象,该对象包含由某一命令返回的结果集。
ExecuteScalar:此方法返回一个值。该值始终是该命令返回的第一行的第一列。
ExecuteXmlReader:此方法返回 FOR XML 查询的 XML 片段。
除了这些公共方法外,SqlHelper 类还包含一些专用函数,用于管理参数和准备要执行的命令。不管客户端调用什么样的方法实现,所有命令都通过 SqlCommand 对象来执行。在 SqlCommand 对象能够被执行之前,所有参数都必须添加到Parameters 集合中,并且必须正确设置 Connection、CommandType、CommandText 和 Transaction 属性。
SqlHelper 类中的专用实用程序函数包括:
AttachParameters:该函数用于将所有必要的 SqlParameter 对象连接到正在运行的 SqlCommand。
AssignParameterValues:该函数用于为 SqlParameter 对象赋值。
PrepareCommand:该函数用于对命令的属性(如连接、事务环境等)进行初始化。
ExecuteReader:此专用 ExecuteReader 实现用于通过适当的 CommandBehavior 打开SqlDataReader对象,以便最有效地管理与阅读器关联的连接的有效期。
三、示例代码
在应用SqlHelper前在App.config中配置连接字符串,代码如下:
<configuration>
<!-- 数据库连接串 -->
<connectionStrings>
<add name="Sql"
connectionString="Server=(local);Database=EduBaseDemo;Integrated Security=sspi"
providerName="System.Data.SqlClient"/>
</connectionStrings>
</configuration>
以上代码在下面代码第一句中得到引用。
using System.Configuration; //包含访问配置文件所需的配置管理器;需事先在本项目的“引用”中添加对System.Configuration的引用;
using System.Data; //包含Ado.Net的各类数据对象;
using System.Data.SqlClient; //包含访问SQL Server所需的各类对象;
具体代码:
namespace SqlHelper
{
/// <summary>
/// 公有类:Sql助手;
/// </summary>
public class SqlHelper
{
/// <summary>
/// 私有静态方法:获取SQL命令;
/// (创建包含SQL连接的SQL命令)
/// </summary>
/// <param name="commandText">命令文本</param>
/// <param name="isStoredProcedure">是否存储过程</param>
/// <param name="sqlParameters">SQL参数数组</param>
/// <returns>SQL命令</returns>
private static SqlCommand GetCommand(string commandText, bool isStoredProcedure, SqlParameter[] sqlParameters)
{
SqlConnection sqlConnection = new SqlConnection(); //声明并实例化SQL连接;
sqlConnection.ConnectionString = ConfigurationManager.ConnectionStrings["Sql"].ToString(); //配置管理器从App.config读取连接字符串;
SqlCommand sqlCommand = sqlConnection.CreateCommand(); //调用SQL连接的方法CreateCommand来创建SQL命令;该SQL命令将绑定SQL连接;
sqlCommand.CommandText = commandText; //指定SQL命令的命令文本;
if (isStoredProcedure) //若要求执行存储过程;
{
sqlCommand.CommandType = CommandType.StoredProcedure; //SQL命令的类型设为存储过程;
}
if (sqlParameters != null) //若SQL参数数组非空;
{
sqlCommand.Parameters.AddRange(sqlParameters); //将SQL参数数组内的所有SQL参数,批量添加至SQL命令的参数集合;
}
return sqlCommand; //返回SQL命令;
}
/// <summary>
/// 公有静态方法:查询标量;
/// (查询单值)
/// </summary>
/// <param name="commandText">命令文本</param>
/// <param name="isStoredProcedure">是否存储过程</param>
/// <param name="sqlParameters">SQL参数数组</param>
/// <returns>查询结果</returns>
public static object Scalar(string commandText,bool isStoredProcedure, SqlParameter[] sqlParameters)
{
object result = null; //查询结果可能类型多样,故先声明对象,并指向空值;
using (SqlCommand sqlCommand = GetCommand(commandText, isStoredProcedure, sqlParameters)) //调用SQL助手的静态方法GetCommand来创建SQL命令,并定义其作用范围;
{
sqlCommand.Connection.Open(); //打开SQL命令的连接;
result = sqlCommand.ExecuteScalar(); //调用SQL命令的方法ExecuteScalar来执行命令,并返回单个结果(即标量);
sqlCommand.Connection.Close(); //关闭SQL连接;
}
return result; //返回查询结果;
}
/// <summary>
/// 公有静态方法:写入;
/// (插入、更新、删除)
/// </summary>
/// <param name="commandText">命令文本</param>
/// <param name="isStoredProcedure">是否存储过程</param>
/// <param name="sqlParameters">SQL参数数组</param>
/// <returns>受影响行数</returns>
public static int NonQuery(string commandText, bool isStoredProcedure, SqlParameter[] sqlParameters)
{
int rowAffected = 0; //声明整型变量,用于保存受影响行数;
using (SqlCommand sqlCommand = GetCommand(commandText, isStoredProcedure, sqlParameters)) //调用SQL助手的静态方法GetCommand来创建SQL命令,并定义其作用范围;
{
sqlCommand.Connection.Open(); //打开SQL命令的连接;
rowAffected = sqlCommand.ExecuteNonQuery(); //调用SQL命令的方法ExecuteNonQuery来执行命令,向数据库写入数据,并返回受影响行数;
sqlCommand.Connection.Close(); //关闭SQL连接;
}
return rowAffected; //返回受影响行数;
}
}
}
四、效果截图
PS.如果使用SqlHelper方法调用数据库存储过程,需要获取存储过程的返回值,请使用带有SqlParameter[]参数的方法,Object[]参数的方法无法获取存储过程返回值。