<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ù)名
                   哈希表的特點:一個鍵對應(yīng)一個值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()克隆方法了
                  克隆一份后是什么類型呢,,當(dāng)然要強(qiáng)制轉(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[]進(jìn)行重載,寫上兩個函數(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 風(fēng)雨兼程 閱讀(904) 評論(0)  編輯  收藏 所屬分類: Petshop4.0 案例分析

    主站蜘蛛池模板: 免费黄网在线观看| a拍拍男女免费看全片| 免费**毛片在线播放直播| 国产亚洲玖玖玖在线观看| 亚洲AV日韩AV永久无码绿巨人| 美女免费精品高清毛片在线视| 在线观看亚洲免费视频| 亚洲精品美女久久777777| 亚洲免费日韩无码系列| 亚洲色成人中文字幕网站| a视频在线免费观看| 免费无码黄动漫在线观看| 亚洲久悠悠色悠在线播放| 成人免费毛片观看| 亚洲午夜久久久影院| 精品国产免费人成网站| 亚洲人成伊人成综合网久久久 | 男女啪啪免费体验区| 九九美女网站免费| 国产男女性潮高清免费网站| 国产精品亚洲综合一区在线观看| 最近免费最新高清中文字幕韩国 | 国产精品入口麻豆免费观看| 亚洲中文字幕伊人久久无码| 中文字幕永久免费| 免费大黄网站在线观| av成人免费电影| 亚洲av激情无码专区在线播放| 2022久久国产精品免费热麻豆| 99久久婷婷国产综合亚洲| 99精品视频免费观看| 中文字幕亚洲专区| 理论片在线观看免费| 亚洲国产精品无码久久久秋霞2| 免费h片在线观看网址最新| 亚洲精品无码专区久久| 亚洲熟妇av一区二区三区| 免费下载成人电影| 亚洲婷婷综合色高清在线| 国产成人免费网站在线观看| 精品国产污污免费网站|