標籤: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類