在机房重构的时候有用到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就多么的好,不懂的东西。还有很多,以后还要不断的学习来扩从自己。