<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 案例分析

    主站蜘蛛池模板: 亚洲国产精品ⅴa在线观看| 亚洲成年人电影网站| 日日狠狠久久偷偷色综合免费| 免费人成在线视频| 91丁香亚洲综合社区| 四虎永久在线精品免费网址 | 亚洲综合无码一区二区| 国产色无码精品视频免费| 久久精品夜色噜噜亚洲A∨| 久久最新免费视频| 亚洲avav天堂av在线不卡| 午夜免费福利片观看| 亚洲成人网在线观看| 女人18特级一级毛片免费视频| 亚洲精品无码aⅴ中文字幕蜜桃| 国产自产拍精品视频免费看| 全黄A免费一级毛片| 亚洲国产精品无码中文字| 最近中文字幕大全免费视频| 亚洲a∨无码男人的天堂| 日本特黄特色免费大片| 九九久久精品国产免费看小说| 亚洲日韩激情无码一区| 一级毛片在线免费看| 亚洲最大的成人网| 亚洲?v无码国产在丝袜线观看| 久久成人18免费网站| 亚洲婷婷在线视频| 国产不卡免费视频| 一区二区三区四区免费视频 | 免费夜色污私人影院网站| 情人伊人久久综合亚洲| 国产免费女女脚奴视频网| 国产成人高清亚洲一区久久| 亚洲成A人片在线观看无码不卡| 麻豆视频免费播放| 日本永久免费a∨在线视频 | 亚洲国产精品一区二区成人片国内 | 亚洲Aⅴ无码专区在线观看q| 最近免费中文字幕4| 久久最新免费视频|