<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 30, 文章 - 0, 評論 - 9, 引用 - 0
    數(shù)據(jù)加載中……

    關(guān)于sqlhelper.cs

    public abstract class SqlHelper
              {
                  public static readonly string connectionString = ConfigurationManager.ConnectionStrings["SqlConnString"].ConnectionString;
            
                  SqlConnection conn;

                  #region open SqlConnection
                  public static void Open() {
                       conn = new SqlConnection(connectionString);
                       if (conn.State != ConnectionState.Open)
                          conn.Open();
                  }    
                  #endregion

                  #region close SqlConnection
                  public static void Close() {
                      if (conn != null)
                      {
                          conn.Close();
                          conn.Dispose();
                      }
                  }        
                  #endregion

                  #region prepare SqlCommand
                  private static void PrepareCommand(SqlCommand cmd, CommandType cmdType, string cmdText, SqlParameter[] cmdParms) {
                      Open();
                      cmd.Connection = conn;
                      cmd.CommandType = cmdType;
                      cmd.CommandText = cmdText;

                      if (cmdParms != null)
                      {
                          foreach (SqlParameter parm in cmdParms)
                              cmd.Parameters.Add(parm);
                      }
                  }
                  #endregion

                  #region parm cache
                  /*
                   使用一個哈希表來保存緩存的參數(shù) 只緩存參數(shù)名
                   哈希表的特點:一個鍵對應一個值key對value(為object需要類型轉(zhuǎn)化)        不能出現(xiàn)兩個相同的鍵 否則error
             
                   下面的哈希表parmCache定義為static即一次定義全局使用
                   所以可能會出現(xiàn)有人在讀的時候,有人在寫,一般會用Lock就像Asp中用Application["count"]來統(tǒng)計點擊數(shù)一樣
                   要先鎖后解鎖
                   但.net框架提供了Synchroized          sync和syncroize中文意思 同步,同時發(fā)生
                   來提供這一操作
                  */
                  private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());

                  public static void CacheParameters(string cacheKey, params SqlParameter[] commandParameters) {
                      parmCache[cacheKey] = commandParameters;
                  }

                  /*
                  1、為何要克隆呢 為何不直接return cachedParms
             
                  有一個參數(shù)數(shù)組
                  SqlParameter[] parms={
                  new SqlParameter("@num1",SqlDbType.Int,4),
                  new SqlParameter("@num2",SqlDbType.Int,4)
                  }
                  緩存該數(shù)組
                  用戶a和b都執(zhí)行插入操作
                  a用戶插入了1,1
                  b用戶插入了2,2
                  如果不用克隆的話,參數(shù)數(shù)組只有一份
                  而2個用戶需要根據(jù)不同的情況賦于不同的值
                  所以就用了克隆了
            
                  2、(ICloneable)cachedParms[i]先將HashTable轉(zhuǎn)為ICloneable這樣HashTable就具有了Clone()克隆方法了
                  克隆一份后是什么類型呢,,當然要強制轉(zhuǎn)化為(SqlParameter)了
                  最后將它賦值給clonedParms[i]
                  */       
                  public static SqlParameter[] GetCachedParameters(string cacheKey) {
                      SqlParameter[] cachedParms = (SqlParameter[])parmCache[cacheKey];

                      if (cachedParms == null)
                          return null;
                      SqlParameter[] clonedParms = new SqlParameter[cachedParms.Length];

                      for (int i = 0; i < cachedParms.Length; i++)
                          clonedParms[i] = (SqlParameter)((ICloneable)cachedParms[i]).Clone();

                      return clonedParms;
                  }
                  #endregion        
            
                  //below method support sqltext and procedure

                  #region ExecuteReader
                  /*
                   parms的作用,這也是一個知識點
                   舉例:
                   ExecuteReader(*,*,null)成功運行
                   ExecuteReader(*,*,new SqlParameter(*))成功運行
                   ExecuteReader(*,*,new SqlParameter(*),new SqlParameter(*))成功運行
                   ExecuteReader(*,*,{new SqlParameter(*),new SqlParameter(*),})成功運行
                   它讓參數(shù)類型和參數(shù)個數(shù)任意
                   這可給了不是一般的好處,你不必為SqlParameter和SqlParameter[]進行重載,寫上兩個函數(shù)
                   又為null寫上一個函數(shù),因為null會不明確調(diào)用SqlParameter的函數(shù)還是SqlParameter[]的函數(shù)
                   啥你不知道我在說什么,打屁屁,那回去看看c++的函數(shù)重載
                   */
                  public static SqlDataReader ExecuteReader(CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {
                
                      SqlCommand cmd = new SqlCommand();

                      try {
                          PrepareCommand(cmd, null, cmdType, cmdText, commandParameters);
                          SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                          cmd.Parameters.Clear();
                          return rdr;
                      }
                      catch {
                          Close();
                          throw;
                      }
                  }
                  #endregion

                  #region ExecuteNonQuery
                  public static void ExecuteNonQuery(CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {

                      SqlCommand cmd = new SqlCommand();

                      PrepareCommand(cmd, cmdType, cmdText, commandParameters);
                      cmd.ExecuteNonQuery();
                      cmd.Parameters.Clear();

                      Close();
                  }
                  #endregion

                  #region ExecuteScalar
                  public static object ExecuteScalar(CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {

                      SqlCommand cmd = new SqlCommand();

                      PrepareCommand(cmd, cmdType, cmdText, commandParameters);
                      object val = cmd.ExecuteScalar();
                      cmd.Parameters.Clear();

                      Close();
                      return val;
                  }
                  #endregion


              }
    }

    posted on 2007-12-26 10:30 風雨兼程 閱讀(904) 評論(0)  編輯  收藏 所屬分類: Petshop4.0 案例分析

    主站蜘蛛池模板: 亚洲va无码va在线va天堂| 国产精品V亚洲精品V日韩精品| 亚洲国产综合专区在线电影| 国产黄在线观看免费观看不卡 | 亚洲AV无码国产精品麻豆天美| 色网站在线免费观看| 国产免费久久精品| 青青视频免费在线| 婷婷综合缴情亚洲狠狠尤物| 四虎精品免费永久免费视频| 亚洲欧洲精品成人久久奇米网| 成在人线av无码免费高潮水| 日本红怡院亚洲红怡院最新| 久久精品电影免费动漫| 99久久亚洲综合精品成人网| 免费看美女裸露无档网站| 亚洲日韩一区二区三区| 免费一级特黄特色大片在线 | 亚洲精品国产高清嫩草影院| 精品一区二区三区高清免费观看| 久久久久噜噜噜亚洲熟女综合| 秋霞人成在线观看免费视频 | 亚洲AV成人片无码网站| 亚洲国产综合无码一区二区二三区| 久久毛片免费看一区二区三区| 亚洲精品福利视频| 麻豆国产精品入口免费观看| 国产精品1024在线永久免费| 777亚洲精品乱码久久久久久 | 日本在线观看免费高清| 亚洲va无码va在线va天堂| 中文字幕无码成人免费视频| 男女超爽视频免费播放| 亚洲天堂男人天堂| 国产免费观看a大片的网站| 青青操在线免费观看| youjizz亚洲| 一本久久a久久精品亚洲| 日本免费xxxx| 丝袜捆绑调教视频免费区| 亚洲av极品无码专区在线观看|