前言:
其实如果让我说为什么要封装SqliteHelper这个类,我也说不上具体原因;但是我知道简化了D层的代码,也就是解决了代码冗余的问题,除此外肯定和占用资源也存在一定的关系;借助于VS中内置的方法,我们可以轻而易举的封装针对数据库操作的指令。
public static class SqlHelper
{
private static string connStr = ConfigurationManager.ConnectionStrings["sql"].ConnectionString;
public static int ExecuteNonQuery(string sql, params SqlParameter[] ps)
{
using (SqlConnection conn = new SqlConnection(connStr))
{
#region SqlConnection和SqlCommond连接
SqlCommand cmd = new SqlCommand(sql, conn);
//SqlCommand cmd = conn.CreateCommand();
//cmd.CommandText = sql;
#endregion
cmd.Parameters.AddRange(ps);
conn.Open();
return cmd.ExecuteNonQuery();
}
}
public static object ExecuteScalar(string sql, params SqlParameter[] ps)
{
using (SqlConnection conn = new SqlConnection(connStr))
{
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.AddRange(ps);
conn.Open();
return cmd.ExecuteScalar();
}
}
public static DataTable GetDateTable(string sql, params SqlParameter[] ps)
{
using (SqlConnection conn = new SqlConnection(connStr))
{
SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);
DataTable dt = new DataTable();
adapter.SelectCommand.Parameters.AddRange(ps);
adapter.Fill(dt);
return dt;
}
}
#region 执行sql脚本,返回一个SqlDataReader
public static SqlDataReader ExecuterReader(string sql, params SqlParameter[] ps)
{
//sqldataReader在读取数据的时候,独占sqlconnection对象,因此必须是开的状态
SqlConnection conn = new SqlConnection(connStr);
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.AddRange(ps);
conn.Open();
//CommandBehavior.CloseConnection代表,当sqldatareader释放的时候,顺道把sqlconnection一同释放了
return cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
#endregion
}
结语:
最后咱们聊聊为什么要封装成这个样子,我们应该可以看到类中的四个静态方法是依据SqlCommand的三个方法+SQL适配器一个方法进行编写的;
cmd.ExecuteNonQuery | 返回受影响的行数 |
---|---|
cmd.ExecuteScalar() | 返回结果集中的第一行的第一列 |
cmd.ExecuteReader() | 读取结果集中的数据 |
adapter.Fill(DataTable) | 填充查询数据到DataTable表中 |
解说:也许会有伙伴有疑问,为什么不释放SqlCommand和SqldataReader中的资源,其实没有这个必要,现在的版本中已经能够自动释放它了,我们只需要管sqlConnection就可以了;