1. SqlHelper类介绍
在C#开发中,数据库操作是十分常见的。数据库操作的核心就是对SQL语句的操作。对于一些常见的操作,我们可以封装在一个类中方便调用。而SqlHelper类就是用于封装常见数据库操作的类。
SqlHelper类封装了ADO.NET对象的创建和使用过程,简化了开发人员对ADO.NET的使用,主要提供以下几种功能:
封装常用的增删改查操作
支持事务处理
支持参数化查询
支持DataSet、DataTable、DataReader等数据对象的操作
2. SqlHelper类的使用
2.1 引用SqlHelper类
引用SqlHelper类需要在项目中添加一个SqlHelper.cs文件。SqlHelper类的代码如下:
public class SqlHelper
{
private static string connectionString = "server=localhost;database=mydb;uid=myuser;pwd=mypassword;";
public static SqlConnection CreateConnection()
{
SqlConnection connection = new SqlConnection(connectionString);
connection.Open();
return connection;
}
public static void CloseConnection(SqlConnection connection)
{
if (connection != null)
{
connection.Close();
}
}
public static int ExecuteNonQuery(string sql, params SqlParameter[] parameters)
{
using (SqlConnection connection = CreateConnection())
{
using (SqlCommand command = connection.CreateCommand())
{
command.CommandText = sql;
command.Parameters.AddRange(parameters);
return command.ExecuteNonQuery();
}
}
}
public static object ExecuteScalar(string sql, params SqlParameter[] parameters)
{
using (SqlConnection connection = CreateConnection())
{
using (SqlCommand command = connection.CreateCommand())
{
command.CommandText = sql;
command.Parameters.AddRange(parameters);
return command.ExecuteScalar();
}
}
}
public static SqlDataReader ExecuteReader(string sql, params SqlParameter[] parameters)
{
SqlConnection connection = CreateConnection();
using (SqlCommand command = connection.CreateCommand())
{
command.CommandText = sql;
command.Parameters.AddRange(parameters);
return command.ExecuteReader(CommandBehavior.CloseConnection);
}
}
public static DataSet ExecuteDataSet(string sql, params SqlParameter[] parameters)
{
DataSet ds = new DataSet();
using (SqlConnection connection = CreateConnection())
{
using (SqlDataAdapter adapter = new SqlDataAdapter())
{
adapter.SelectCommand = new SqlCommand(sql, connection);
adapter.SelectCommand.Parameters.AddRange(parameters);
adapter.Fill(ds);
}
}
return ds;
}
}
2.2 新建数据库连接
使用SqlHelper类进行数据库操作前,需要先建立连接。连接的创建可以由SqlHelper类的CreateConnection()
方法完成。
以下代码演示了如何建立连接:
SqlConnection connection = SqlHelper.CreateConnection();
2.3 执行sql语句
执行sql语句有三种方式:ExecuteNonQuery、ExecuteScalar和ExecuteReader。
2.3.1 ExecuteNonQuery
用于执行增、删、改等操作的SQL语句,返回受影响的行数。
以下代码演示了如何执行sql语句:
string sql = "INSERT INTO [dbo].[user] ([name], [age]) VALUES (@name, @age)";
SqlParameter[] parameters = {
new SqlParameter("@name", "张三"),
new SqlParameter("@age", 18)
};
int count = SqlHelper.ExecuteNonQuery(sql, parameters);
2.3.2 ExecuteScalar
用于执行一些简单的查询语句,获取单行单列的值。例如:查询所有记录的个数。
以下代码演示了如何使用ExecuteScalar:
string sql = "SELECT COUNT(*) FROM [dbo].[user]";
object count = SqlHelper.ExecuteScalar(sql);
2.3.3 ExecuteReader
用于执行一些比较复杂的查询语句,例如:使用SELECT语句查询数据表的所有数据。
以下代码演示了如何使用ExecuteReader:
string sql = "SELECT * FROM [dbo].[user]";
SqlDataReader reader = SqlHelper.ExecuteReader(sql);
while (reader.Read())
{
int id = (int)reader["id"];
string name = (string)reader["name"];
int age = (int)reader["age"];
}
2.4 查询数据
SqlHelper类中提供了ExecuteDataSet方法用于查询数据,该方法返回查询结果的DataSet对象。
以下代码演示了如何使用ExecuteDataSet方法:
string sql = "SELECT * FROM [dbo].[user]";
DataSet ds = SqlHelper.ExecuteDataSet(sql);
foreach (DataRow row in ds.Tables[0].Rows)
{
int id = (int)row["id"];
string name = (string)row["name"];
int age = (int)row["age"];
}
2.5 参数化查询
在执行Sql语句时,为了避免SQL注入攻击,使用参数化查询是比较好的选择。SqlHelper类提供了支持参数化查询的方法。
以下代码演示了如何使用参数化查询:
string sql = "SELECT * FROM [dbo].[user] WHERE [name]=@name AND [age]=@age";
SqlParameter[] parameters = {
new SqlParameter("@name", "张三"),
new SqlParameter("@age", 18)
};
SqlDataReader reader = SqlHelper.ExecuteReader(sql, parameters);
while (reader.Read())
{
int id = (int)reader["id"];
string name = (string)reader["name"];
int age = (int)reader["age"];
}
2.6 事务处理
SqlHelper类也提供了事务处理的支持。使用SqlHelper类实现事务的步骤如下:
开启事务
执行SQL语句
判断是否出现异常
提交或回滚事务
以下代码演示了如何实现事务处理:
SqlConnection connection = SqlHelper.CreateConnection();
SqlTransaction transaction = connection.BeginTransaction();
try
{
string sql1 = "INSERT INTO [dbo].[user] ([name], [age]) VALUES ('张三', 18)";
string sql2 = "UPDATE [dbo].[user] SET [age]=19 WHERE [name]='张三'";
SqlHelper.ExecuteNonQuery(sql1);
SqlHelper.ExecuteNonQuery(sql2);
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
}
finally
{
SqlHelper.CloseConnection(connection);
}
3. 总结
通过上文的介绍,我们学习到了SqlHelper类的功能和使用方法。SqlHelper类的封装了常见数据库操作,使用SqlHelper类可以简化开发人员对ADO.NET的使用。