优化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();
}
}
浙公网安备 33010602011771号