强大的SQLHelper类


  在做机房收费系统的时候,曾经使用过Sqlhelper,当时对此内容理解不是很好,参照的是下篇的博客:

  vb.net—SQLHelper类的使用

 

 而做过之后,当再次回首往事的时候,发现这个SQLHelper类并

不是那么的强大。其实可以在多扩充些。并且不好的地方是没有加入安全的事务机制,在此小编在前人的基础上,模仿别人写了一个类似的Sqlhelper。先看下类图。


 首先看一下此类,一共包含了13中方法,是对数据库增删改查的扩充,方便了用户的各种操作。比如当查询数据库的时候,可以返回DataRow、DataTable、DataSet、SqlDataReader类型的数值;当进行增删操作时,返回的数值类型包括bool、int等,分别代表是否更新成功、插入的行数等


 其次在本类中更新数据库的时候,采用了HashTable传参的方式,只需要把更新的数值赋给HashTable以及更新的表名即可,免去了当初拼接更新数据库语句的麻烦。


 最后,在本类中引入了SqlTransaction事务机制安全机制,当出现意外时,可以采取事务回滚的办法保证了数据的完整性和一致性问题。

 

// 数据库接口类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();     //连接处于打开状态,关闭连接}}/// /// 析构函数,释放非托管资源/// ~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操作返回影响到的行数,其他情况为-1public int RunProc(string ProcName) {int Count = -1;SqlCommand Cmd = CreateCommand(ProcName, null);Count = Cmd.ExecuteNonQuery();Close();return Count;}//公有方法,调用存储过程(不带参数)//输入://			ProcName存储过程名//输出://      对Update、Insert、Delete操作返回影响到的行数,其他情况为-1public int RunStr(string StrName){int Count = -1;SqlCommand Cmd = CreateStrCommand(StrName, null);Count = Cmd.ExecuteNonQuery();Close();return Count;}//公有方法,调用存储过程(带参数)//输入://      ProcName - 存储过程名//      Params   - 用来调用存储过程的参数表//输出://      对Update、Insert、Delete操作返回影响到的行数,其他情况为-1public 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操作返回影响到的行数,其他情况为-1public 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;}}/// /// 公有方法,更新一个数据表。/// /// 表名/// 哈西表,键值为字段名,值为字段值/// Where子句/// 是否成功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);}/// /// 执行SQL语句的方法/// /// /// 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;}/// /// 公有方法,获取数据,返回一个DataTable。/// /// Sql语句/// DataTablepublic DataTable GetDataTable(String SqlString){DataSet dataset = GetDataSet(SqlString);dataset.CaseSensitive = false;return dataset.Tables[0];}}


   总结:

      其实从宏观上来分析此SQLHelper,其实就是对数据库增删改查的应用。在增和删的基础上加入了事务安全机制,在查的基础上,返回值为多种类型可供选择。此SQLHelper类简单易用,用的时候,只需调用相应函数并传入参数即可。





本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部