PetShop分析系列2-在数据访问层2-about sqlhelper

       在上面的一版里,出现了Sqlhelper。究竟是什么呢?我们来看看究竟。我猜测应该是对数据库连接和断连接的类的再封装。

      打开在DBUtility的sqlhelper.cs.一看,又是一群属性的定义:
        public static readonly string ConnectionStringLocalTransaction = ConfigurationManager.ConnectionStrings["SQLConnString1"].ConnectionString;

        public static readonly string ConnectionStringInventoryDistributedTransaction = ConfigurationManager.ConnectionStrings["SQLConnString2"].ConnectionString;

        public static readonly string ConnectionStringOrderDistributedTransaction = ConfigurationManager.ConnectionStrings["SQLConnString3"].ConnectionString;
        这里用的readonly,为什么呢?不明白~~~~
        可以看看这个地址:http://www.dezai.cn/study/Article_Show.asp?ArticleID=5565

        // 使用HASH去保存内存的元素
        private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());

        //然后重新封装了sqlconnection的ExecuteNonQuery方法,这里又出现了一个PrepareCommand的方法。看看又封装了什么呢?
        private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms) {
          
 if (conn.State != ConnectionState.Open)
                conn.Open(); //原来这个才是封装了连接数据库的元凶!

            cmd.Connection = conn;
            cmd.CommandText = cmdText;

            if (trans != null)
                cmd.Transaction = trans;

            cmd.CommandType = cmdType;

            if (cmdParms != null) {
                foreach (SqlParameter parm in cmdParms)
                    cmd.Parameters.Add(parm);//把传递进去的元素数组逐个添加
            }
 
public static int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {

            SqlCommand cmd = new SqlCommand();

            using (SqlConnection conn = new SqlConnection(connectionString)) {
                PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
                int val = cmd.ExecuteNonQuery();
                cmd.Parameters.Clear();
                return val;//返回影响的行数
            }//又使用了using方法,自动释放conn连接的内存,当{}里运行完了。
        }
//后面又重载了改方法ExecuteNonQuery(SqlTransaction trans, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)

//重新封装了sqlDataReader     
   public static SqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {
            SqlCommand cmd = new SqlCommand();
            SqlConnection conn = new SqlConnection(connectionString);
            try {
                PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
                SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                cmd.Parameters.Clear();
                return rdr;
            }
            catch {
                conn.Close();
                throw;
            }
        }

最后这个类还通过CacheParameters,GetCachedParameters和前面的静态HASH变量,实现了一个缓存数组的方法。但总觉得很莫名奇妙。但是这个可以暂且不管。学习就是这样,有时候有不懂的可以绕着走。或许我们把整个数据库访问层看了一遍,这个就能看懂了。

posted @ 2006-11-09 09:33  天天爱晴天  阅读(339)  评论(0)    收藏  举报