后腾之秀

 

优化SQLHelper

优化SQLHelper代码

连接,传参,执行

连接优点:

构造函数

1.构造函数是最先执行的:

所以牛腩把数据库连接放在里面了:

string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;

 

2.构造函数是初始化类,以后供其他函数使用对象的不同的成员

private SqlConnection conn = new SqlConnection(connStr);

例如

对类的一些必要参数进行初始化。就象你买一块豆腐,回家可以炒、切、扮、炖、煮——在后期给它任何它所支持的“属性”,但是在豆腐房里,别人做豆腐的就有一套完整的流程来制作,而这个流程就是“构造函数”咯。它可以保证在豆腐出厂的时候,都是标准的四方型,而不是球的。

 

优点:

声明全局变量

如声明3个变量,用在不同的函数中,简洁多了,因为函数都使用,所以每次都要保证变量为null

        private SqlConnection conn = null;

        private SqlCommand cmd = null;

        private SqlDataReader sdr = null;

 

 

优点:

利用connectionstate连接状态对数据库进行

            if (conn.State == ConnectionState.Closed)

            {

                conn.Open();

            }

只打开一次

只关闭一次

 

 

传参优点:

 

进行传参,永远是对Transact-SQL 语句或存储过程进行传参

所以看SQL的语句有多少个参数,再确定用那种方式增加;

 

SqlCommand.Parameters 属性

Transact-SQL 语句或存储过程的参数。 默认值为空集合。

sqlcommand.Parameters.Add()为空集添加SQL元素。

 

对于多个参数的SQL语句

用到sqlparameter类

表示 SqlCommand.Parameters的参数,也可以是它到 DataSet 列的映射

 

例如:

对于一个参数的SQL语句

 string sql = "select *from Table1 where Username=@username";

 cmd.Parameters.Add(new SqlParameter("username", us.Text));

 

 

SqlParameter[] paras = {

      new SqlParameter("@name", strName),

      new SqlParameter("@photo", byteImage)

};

 

sqlcmd.Parameters.AddRange(paras);

 

查询语句

while (rd.Read()){

  Console.WriteLine("User Name: {0}\tPassword: {1}", rd["UserName"], rd["Password"]);

                  }

 

再看一下牛人中的查询语句

很简洁啊,就那么几行代码

DataTable dt = new DataTable();

using (SqlDataRead sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))

{

    dt.Load(sdr);//提供给sqlDataReader,用某个数据源的值填充 DataTable。

}

return dt;//返回一个填充了数据的table

 

CommandBehavior.CloseConnection的作用,如果关闭关联的 DataReader 对象,则关联的 Connection 对象也将关闭。

 

 

牛人的最厉害之处是他只用了一次using,不像杨中科用了多次

private SqlConnection GetConn()

{

    if (conn.State == ConnectionState.Closed)

    {

        conn.Open();

    }

    return conn;//conn作为sqlcommand的参数

}

 

using (cmd = new SqlCommand(cmdText, GetConn()))

{

    cmd.CommandType = ct;

    cmd.Parameters.AddRange(paras);

    res = cmd.ExecuteNonQuery();

}

因为GetConn()连接放在了带有using里的sqlcommand的参数中,所以最后会关闭连接。

using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))

{

    dt.Load(sdr);

}

CommandBehavior.CloseConnection也一样,如果关闭关联的 DataReader 对象,则关联的 Connection 对象也将关闭。

 

缺点:

今天在很多资料中查到,还是认为杨的有点乱套代码了

下面是从牛人经验中得到的知识,如果不会人家没有胆量乱说的,所以要相信牛人:

using(sqlcommand cmd=new sqlcomand())

没必要用using把SqlCommnand扩起来,

using的目的只是出大括号前自动调用对象的Dispose方法,Dispose方法用来释放分配的非托管资源,只有分配了非托管资源的对象才需要调用using,

比如SqlConnection 包含的和数据库的连接,就是非托管资源,.Net不能自动释放这些资源,所以SqlConnection实现了Dispose方法释放连接资源,而using则会自动调用SqlConnection的Dispose方法,

而SqlCommnand没有分配和管理任何非托管资源,其实SqlCommnand是一个数据对象,里面只是保存了一些sql语句的字符串对象,是一个很简单的对象,没有分配非托管资源,就不需要调用Dispose方法,也不需要用using括起来,当然括起来也没坏处

 

另外:

SqlDataReader和Sqlconnection也一样

当使用 SqlDataReader 将关联的 SqlConnection 用于任何其他用途时,必须显式调用 Close 方法。

 

Close 方法填写输出参数的值、返回值和 RecordsAffected,从而增加了关闭用于处理大型或复杂查询的 SqlDataReader 所用的时间。 如果返回值和查询影响的记录的数量不重要,则可以在调用 Close 方法前调用关联的 SqlCommand 对象的 Cancel 方法,从而减少关闭 SqlDataReader 所需的时间。(只需知道,不需要理解深入)

 

 

例如:

 using (SqlConnection connection =

               new SqlConnection(connectionString))

    {

        SqlCommand command =

            new SqlCommand(queryString, connection);

        connection.Open();

        SqlDataReader reader = command.ExecuteReader();

        while (reader.Read())

        {

            Console.WriteLine(String.Format("{0}, {1}",

                reader[0], reader[1]));

        }

        reader.Close();

    }

 

佩服

所以我超佩服牛人,也许牛人的认认真真罢,因为我认为在ADO.NET方面,牛人比杨厉害多了,优化的深度很高。

它不需要在有sqlconnection和sqldataread用两个using中

显然using只用于一个对象,两个对象不能用两个using怎么办,所以要用关联关闭了

using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))

 

 

不过从准确和清晰性来说,我认为

牛腩有点过于复杂了,不必记忆太多代码,且具有统一性

只需要在后面加上 reader.Close();

 

 

以下是我的优化代码(经过了4小时分析以上的代码)

涵盖了牛人的代码,MSDN代码,CSDN的解析,我的统一性

private SqlConnection GetConn()

{

    if (conn.State == ConnectionState.Closed)

    {

        conn.Open();

    }

    return conn;//conn作为sqlcommand的参数

}

 

增删改三部曲

using连接,sqlparatem传参,cmd执行

public int ExecuteNonQuery(string cmdText, SqlParameter[] paras, CommandType ct)

{

int res;

using (SqlCommand cmd = new SqlCommand(sql, GetConn()))

{

cmd.CommandType = ct;

cmd.Parameters.AddRange(paras);

cmd.ExecuteNonQuery();

}

return res;

}

 

查询三部曲

public DataTable ExecuteQuery(string cmdText, SqlParameter[] paras, CommandType ct)

{

using (SqlConnection conn = new SqlConnection(connstr))

{

DataTable dt = new DataTable();

SqlCommand cmd = new SqlCommand(sql, GetConn());

cmd.CommandType = ct;

SqlDataReader sdr = cmd.ExecuteReader();

dt.Load(sdr);

return dt;

sdr.Close();

}

}

 

 

posted on 2011-11-19 21:34  后腾之秀  阅读(695)  评论(0)    收藏  举报

导航