強大的SQLHelper類

來源:互聯網
上載者:User

標籤:style   blog   http   io   os   使用   ar   for   資料   


  在做機房收費系統的時候,曾經使用過Sqlhelper,當時對此內容理解不是很好,參照的是下篇的部落格:

  vb.net—SQLHelper類的使用

 

 而做過之後,當再次回首往事的時候,發現這個SQLHelper類並

不是那麼的強大。其實可以在多擴充些。並且不好的地方是沒有加入安全的事務機制,在此小編在前人的基礎上,模仿別人寫了一個類似的Sqlhelper。先看下類圖。


 首先看一下此類,一共包含了13中方法,是對資料庫增刪改查的擴充,方便了使用者的各種操作。比如當查詢資料庫的時候,可以返回DataRow、DataTable、DataSet、SqlDataReader類型的數值;當進行增刪操作時,返回的數值類型包括bool、int等,分別代表是否更新成功、插入的行數等


 其次在本類中更新資料庫的時候,採用了HashTable傳參的方式,只需要把更新的數值賦給HashTable以及更新的表名即可,免去了當初拼接更新資料庫語句的麻煩。


 最後,在本類中引入了SqlTransaction事務機制安全機制,當出現意外時,可以採取交易回復的辦法保證了資料的完整性和一致性問題。

 

<span style="font-family:SimSun;font-size:18px;">// 資料庫介面類public class DataBase{//私人變數,資料庫連接protected SqlConnection Connection;        protected string ConnectionString;//建構函式public DataBase(){            ConnectionString = "Data Source=(local);DataBase=**;User ID=sa;Password=**;";           }//保護方法,開啟資料庫連接private void Open(){  //判斷資料庫連接是否存在if (Connection == null){  //不存在,建立並開啟Connection = new SqlConnection(ConnectionString);                    Connection.Open();}else{  //存在,判斷是否處於關閉狀態  if (Connection.State.Equals(ConnectionState.Closed))  Connection.Open();    //串連處於關閉狀態,重新開啟}}//公有方法,關閉資料庫連接public void Close() {if (Connection.State.Equals(ConnectionState.Open)){                Connection.Close();     //串連處於開啟狀態,關閉串連}}        /// <summary>/// 解構函式,釋放非託管資源/// </summary>~DataBase(){try{if (Connection != null)Connection.Close();}catch{}try{Dispose();}catch{}}//公有方法,釋放資源public void Dispose(){if (Connection != null)// 確保串連被關閉{Connection.Dispose();            Connection = null;}}//公有方法,根據Sql語句,返回是否查詢到記錄public bool GetRecord(string XSqlString){            Open();            SqlDataAdapter adapter = new SqlDataAdapter(XSqlString, Connection);                        DataSet dataset = new DataSet();            adapter.Fill(dataset);                        Close();            if (dataset.Tables[0].Rows.Count > 0){return true;}else{return false;}}//公有方法,返回Sql語句獲得的資料值//SqlString的格式:select count(*) from XXX where ...//                 select max(XXX) from YYY where ...public int GetRecordCount(string XSqlString){            string SCount;Open();SqlCommand Cmd = new SqlCommand(XSqlString,Connection);            SCount = Cmd.ExecuteScalar().ToString().Trim();            if (SCount=="")            SCount="0";Close();return Convert.ToInt32(SCount);}//公有方法,根據XWhere查詢資料表XTableName中的某些紀錄//XTableName--表名//XHT--雜湊表,鍵為欄位名,值為欄位值public DataSet AdvancedSearch(string XTableName, Hashtable XHT){int Count = 0;string Fields = "";foreach(DictionaryEntry Item in XHT){if (Count != 0){Fields += " and ";}Fields += Item.Key.ToString();Fields += " like '%";Fields += Item.Value.ToString();                Fields += "%'";Count++;}Fields += " ";string SqlString = "select * from " + XTableName + " where " + Fields;            Open();            SqlDataAdapter Adapter = new SqlDataAdapter(SqlString, Connection);            DataSet Ds = new DataSet();            Adapter.Fill(Ds);            Close();            return Ds;}        //私人方法,獲得一個用來調用預存程序的SqlCommand        //輸入:        //      ProcName - 預存程序名        //      Params   - 用來調用預存程序的參數表        private SqlCommand CreateCommand(string ProcName, SqlParameter[] Prams)         {          Open();          SqlCommand Cmd = new SqlCommand(ProcName, Connection);          Cmd.CommandType = CommandType.StoredProcedure;          if (Prams != null)           {            foreach (SqlParameter Parameter in Prams)              Cmd.Parameters.Add(Parameter);                      }          return Cmd;        }        //私人方法,執行SQL命令        //輸入:        //      StrName - 預存程序名        //      Params   - 用來調用預存程序的參數表        private SqlCommand CreateStrCommand(string StrName, SqlParameter[] Prams)        {            Open();            SqlCommand Cmd = new SqlCommand(StrName, Connection);            Cmd.CommandType = CommandType.Text;            if (Prams != null)            {                foreach (SqlParameter Parameter in Prams)                    Cmd.Parameters.Add(Parameter);            }            return Cmd;        }        //公有方法,執行個體化一個用於調用預存程序的參數        //輸入:        //      ParamName - 參數名稱        //      DbType- 參數類型        //      Size- 參數大小        //Direction - 傳遞方向        //Value- 值        public SqlParameter MakeParam(string ParamName, SqlDbType DbType, Int32 Size, ParameterDirection Direction, object Value)         {          SqlParameter Param;          if(Size > 0)                          Param = new SqlParameter(ParamName, DbType, Size);          else Param = new SqlParameter(ParamName, DbType);          Param.Direction = Direction;          if (Value != null)            Param.Value = Value;          return Param;        }//公有方法,執行個體化一個用於調用預存程序的輸入參數//輸入://      ParamName - 參數名稱//      DbType- 參數類型//      Size- 參數大小//Value- 值        public SqlParameter MakeInParam(string ParamName, SqlDbType DbType, int Size, object Value)         {          return MakeParam(ParamName, DbType, Size, ParameterDirection.Input, Value);        }        //公有方法,調用預存程序(不帶參數)    //輸入:    //ProcName預存程序名        //輸出:    //      對Update、Insert、Delete操作返回影響到的行數,其他情況為-1        public int RunProc(string ProcName)         {    int Count = -1;            SqlCommand Cmd = CreateCommand(ProcName, null);            Count = Cmd.ExecuteNonQuery();            Close();return Count;        }        //公有方法,調用預存程序(不帶參數)        //輸入:        //ProcName預存程序名        //輸出:        //      對Update、Insert、Delete操作返回影響到的行數,其他情況為-1        public int RunStr(string StrName)        {            int Count = -1;            SqlCommand Cmd = CreateStrCommand(StrName, null);            Count = Cmd.ExecuteNonQuery();            Close();            return Count;        }        //公有方法,調用預存程序(帶參數)        //輸入:        //      ProcName - 預存程序名        //      Params   - 用來調用預存程序的參數表        //輸出:        //      對Update、Insert、Delete操作返回影響到的行數,其他情況為-1        public int RunProc(string ProcName, SqlParameter[] Params)        {            int Count = -1;            SqlCommand Cmd = CreateCommand(ProcName, Params);            Count = Cmd.ExecuteNonQuery();            Close();            return Count;        }        //公有方法,執行指定SQL語句        //輸入:        //      ProcStr - SQL語句        //輸出:        //      對Update、Insert、Delete操作返回影響到的行數,其他情況為-1        public int ProcStr(string StrName,SqlParameter[] Params)         {            int Count = -1;            SqlCommand Cmd = CreateStrCommand(StrName, Params);            Count = Cmd.ExecuteNonQuery();            Close();            return Count;        }        //公有方法,調用預存程序(不帶參數)        //輸入:        //ProcName預存程序名    //輸出:        //將執行結果以SqlDataReader返回    //注意:使用後主意調用SqlDataReader.Close()方法        public SqlDataReader RunProcGetReader(string ProcName)         {          SqlCommand Cmd = CreateCommand(ProcName, null);          return Cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);        }//公有方法,調用預存程序(帶參數)//輸入://ProcName - 預存程序名//      Params - 預存程序需要的參數//輸出://將執行結果以SqlDataReader返回//注意:使用後主意調用SqlDataReader.Close()方法        public SqlDataReader RunProcGetReader(string ProcName, SqlParameter[] Params)         {          SqlCommand Cmd = CreateCommand(ProcName, Params);          return Cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);        }        //公有方法,執行SQL命令        //輸入:        //StrName - 預存程序名        //      Params - 執行SQL命令需要的參數        //輸出:        //將執行結果以SqlDataReader返回        //注意:使用後主意調用SqlDataReader.Close()方法        public SqlDataReader RunStrGetReader(string StrName, SqlParameter[] Params)        {            SqlCommand Cmd = CreateStrCommand(StrName, Params);            return Cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);        }        //公有方法,調用預存程序(帶參數)        //輸入:        //ProcName - 預存程序名        //      Params - 預存程序需要的參數        //輸出:        //將執行結果以SqlDataReader返回        //注意:使用後主意調用SqlDataReader.Close()方法        public int RunProcGetCount(string ProcName, SqlParameter[] Params)        {            SqlCommand Cmd = CreateCommand(ProcName, Params);                        string SCount;                        SCount = Cmd.ExecuteScalar().ToString().Trim();            if (SCount == "")                SCount = "0";            Close();            return Convert.ToInt32(SCount);        }        //公有方法,調用預存程序(不帶參數)        //輸入:        //ProcName預存程序名        //輸出:        //將執行結果以DataSet返回            public DataSet GetDataSet(string ProcName)        {            Open();            SqlDataAdapter adapter = new SqlDataAdapter(ProcName, Connection);            DataSet dataset = new DataSet();            adapter.Fill(dataset);            Close();            return dataset;        }        //公有方法,執行SQL命令        //輸入:        //StrName預存程序名        //輸出:        //將執行結果以DataSet返回            public DataSet GetStrDataSet(string StrName)        {            Open();            SqlDataAdapter adapter = new SqlDataAdapter(StrName, Connection);            DataSet dataset = new DataSet();            adapter.Fill(dataset);            Close();            return dataset;        }        //公有方法,調用預存程序(不帶參數)        //輸入:        //ProcName預存程序名        //輸出:        //將執行結果以DataSet返回            public DataSet GetDataSet(string ProcName, SqlParameter[] Params)        {            Open();            SqlCommand Cmd = CreateCommand(ProcName, Params);            SqlDataAdapter adapter = new SqlDataAdapter(Cmd);            DataSet dataset = new DataSet();            adapter.Fill(dataset);            Close();            return dataset;        }        //公有方法,調用預存程序(不帶參數)        //輸入:        //ProcName預存程序名        //輸出:        //將執行結果以DataSet返回            public DataSet GetStrDataSetSql(string StrName, SqlParameter[] Params)        {            Open();            SqlCommand Cmd = CreateStrCommand(StrName, Params);            SqlDataAdapter adapter = new SqlDataAdapter(Cmd);            DataSet dataset = new DataSet();            adapter.Fill(dataset);            Close();            return dataset;        }        //公有方法,根據Sql語句,返回一個結果資料集        public DataSet GetDataSetSql(string XSqlString)        {            Open();            SqlDataAdapter Adapter = new SqlDataAdapter(XSqlString, Connection);            DataSet Ds = new DataSet();            Adapter.Fill(Ds);            Close();            return Ds;        }        //公有方法,根據Sql語句,插入記錄        public int Insert(string XSqlString)        {            int Count = -1;            Open();            SqlCommand cmd = new SqlCommand(XSqlString, Connection);            Count = cmd.ExecuteNonQuery();            Close();            return Count;                    }        //公有方法,根據Sql語句,插入記錄並返回產生的ID號        public int GetIDInsert(string XSqlString)        {            int Count = -1;            Open();            SqlCommand cmd = new SqlCommand(XSqlString, Connection);            Count = Convert.ToInt32(cmd.ExecuteScalar().ToString().Trim());            Close();            return Count;        }               /// 公有方法,擷取資料,返回一個DataRow。        public DataRow GetDataRow(String SqlString)        {            DataSet dataset = GetDataSet(SqlString);            dataset.CaseSensitive = false;            if (dataset.Tables[0].Rows.Count > 0)            {                return dataset.Tables[0].Rows[0];            }            else            {                return null;            }        }        /// <summary>        /// 公有方法,更新一個資料表。        /// </summary>        /// <param name="TableName">表名</param>        /// <param name="Cols">哈西表,索引值為欄位名,值為欄位值</param>        /// <param name="Where">Where子句</param>        /// <returns>是否成功</returns>        public bool Update(String TableName, Hashtable Cols, String Where)        {            int Count = 0;            if (Cols.Count <= 0)            {                return true;            }            String Fields = " ";            foreach (DictionaryEntry item in Cols)            {                if (Count != 0)                {                    Fields += ",";                }                Fields += "[" + item.Key.ToString() + "]";                Fields += "=";                Fields += item.Value.ToString();                Count++;            }            Fields += " ";            String SqlString = "Update " + TableName + " Set " + Fields + Where;            String[] Sqls = { SqlString };            return ExecuteSQL(Sqls);        }        /// <summary>        /// 執行SQL語句的方法        /// </summary>        /// <param name="SqlStrings"></param>        /// <returns></returns>        public bool ExecuteSQL(String[] SqlStrings)        {            bool success = true;            Open();            SqlCommand cmd = new SqlCommand();            SqlTransaction trans = Connection.BeginTransaction();            cmd.Connection = Connection;            cmd.Transaction = trans;            int i = 0;            try            {                foreach (String str in SqlStrings)                {                    cmd.CommandText = str;                    cmd.ExecuteNonQuery();                    i++;                }                trans.Commit();            }            catch            {                                success = false;                trans.Rollback();                Close();            }            finally            {                Close();            }            return success;        }        /// <summary>        /// 公有方法,擷取資料,返回一個DataTable。        /// </summary>        /// <param name="SqlString">Sql語句</param>        /// <returns>DataTable</returns>        public DataTable GetDataTable(String SqlString)        {            DataSet dataset = GetDataSet(SqlString);            dataset.CaseSensitive = false;            return dataset.Tables[0];        }}</span>


   總結:

      其實從宏觀上來分析此SQLHelper,其實就是對資料庫增刪改查的應用。在增和刪的基礎上加入了事務安全機制,在查的基礎上,返回值為多種類型可供選擇。此SQLHelper類簡單易用,用的時候,只需調用相應函數並傳入參數即可。




強大的SQLHelper類

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.