在机房重构的时候有用到SqlHelper(点击查看),当时什么都不懂。后来经过不断的使用,开始理解其中的意思。后来发现原来的SqlHelper写的有点繁琐。对于每个操作都需要写两次,来区分是否带参数。这次,重构一版,来改善一下它的缺点。
长度可变参数params
首先,我们来看一下长度可变参数params。举两个例子来说明
第一个
<span style="font-size:18px;"><span style="font-size:18px;">class Program
{
static void Main(string[] args)
{
int i = Sum(new int[]{2,87,51,5});
Console.WriteLine(i);
Console.ReadKey();
}
static int Sum(int[] sums)
{
int result = 0;
foreach (int i in sums )
{
result += i;
}
return result;
}
}
</span></span>
执行后返回结果为
第二个:
<span style="font-size:18px;">class Program
{
static void Main(string[] args)
{
int i = Sum(2,5,5,5);
Console.WriteLine(i);
Console.ReadKey();
}
static int Sum(params int[] sums)
{
int result = 0;
foreach (int i in sums )
{
result += i;
}
return result;
}
}
</span>
执行后返回结果为:
其中第一个例子中的Sum方法,在声明的时候没有用params修饰符,所以调用的时候需要声明数组。而第二个例子中用了params修饰符,调用的时候,直接输入参数即可。这时就可以来体会一下params的作用了。params将其后所有参数打包,相当于一个数组。如果没有写参数的话,它相当于长度为0的数组。
注:声明params数组时,该数组必须在参数的最后一个,因为它默认会对其后面的所有参数打包。
同理,就可以在SqlHelper的方法中使用params修饰符了。如果有参数,输入参数即可,没有参数就不用输入,相当于长度为0的数组。
使用using()
在数据库执行完成后,需要执行conn.close()和cmd.Dispose()操作。在之前的SqlHelper中,是要将这两句代码写出来的。其实还有更好的方法来代替它。就是使用using(),using()方法实现了IDispose接口,也就是说,如果使用using(),它会自动帮助我们执行了conn.close()和cmd.Dispose()操作。下面,看我重构后的SqlHelper
<span style="font-size:18px;"><span style="font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Data.SqlClient;
using System.Data;
namespace DAL
{
public class SqlHelper
{
//app.config文件的继承:
public static readonly string connstr =
ConfigurationManager.ConnectionStrings["connstr"].ConnectionString;
/// <summary>
/// 执行增删改的SQL语句或存储过程
/// </summary>
/// <param name="cmdText">SQL语句或存储过程名称</param>
/// <param name="parameters">参数</param>
/// <returns>返回受影响的行数</returns>
public int ExecuteNonQuery(string cmdText, CommandType cmdType,
params SqlParameter[] parameters)//在SqlParameter[]前面加上了长度可变参数--params修饰符。</span>
{
try
{ //创建SQL连接
using (SqlConnection conn = new SqlConnection(connstr))
{
//打开连接
conn.Open();
//创建SqlCommand,执行SQL指令
using (SqlCommand cmd = conn.CreateCommand())
{
//SQL语句或存储过程名称
cmd.CommandText = cmdText;
//命令类型
cmd.CommandType = cmdType;
//添加参数
cmd.Parameters.AddRange(parameters);
//返回执行结果
return cmd.ExecuteNonQuery();
}
}
}
catch (Exception ex)
{
//抛出异常
throw new Exception(ex.ToString());
}
}
/// <summary>
/// 执行对数据库的查操作
/// </summary>
/// <param name="cmdText">SQL语句或存储过程</param>
/// <param name="cmdType">命令类型</param>
/// <param name="parameters">参数</param>
/// <returns>返回查询到的表</returns>
public DataTable ExecuteDataTable(string cmdText, CommandType cmdType,
params SqlParameter[] parameters)//在SqlParameter[]前面加上了长度可变参数--params修饰符。
{
try
{
//创建SQL连接
using (SqlConnection conn = new SqlConnection(connstr))
{
//打开连接
conn.Open();
//创建SqlCommand,执行SQL指令
using (SqlCommand cmd = conn.CreateCommand())
{
//SQL语句或存储过程名称
cmd.CommandText = cmdText;
//命令类型
cmd.CommandType = cmdType;
//添加参数
cmd.Parameters.AddRange(parameters);
//定义数据集
DataSet dataset = new DataSet();
//创建数据适配器,执行查询
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
//填充数据集
adapter.Fill(dataset);
//获取数据集中的第一个表
return dataset.Tables[0];
}
}
}
catch (Exception ex)
{
//抛出异常
throw new Exception(ex.ToString());
}
}
}
}
</span></span>
总结:
在这次重构中又学到了长度可变参数params和加深了对using()方法的理解。感觉还是蛮不错的。当然,并不见得重构的SqlHelper就多么的好,不懂的东西。还有很多,以后还要不断的学习来扩从自己。