使用using()" />
当前位置: 代码迷 >> SQL >> 使用using()
  详细解决方案

使用using()

热度:52   发布时间:2016-05-05 10:35:54.0
SqlHelper重构

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


  相关解决方案