微软的SqlHelper做数据层(二)
2007-05-20 11:37
/--如果您认真看的上面有个提问为什么要克隆- -这是利用原型设计模式,克隆一个拷贝然后直接用,如果您是用来做存储过程的实体~~就不必克隆了--省内存
//--接下来改写下- -原创阿 using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Data.SqlClient; namespace Ajaxren { /** <summary> /// 缓存参数用的 /// </summary> public class SqlParametersCache : System.Collections.Generic.Dictionary<string, SqlParameter[]> { public static SqlParametersCache t = new SqlParametersCache(); //--单例构造模式 SqlParametersCache() { } /** <summary> /// 返回对象的实例----因为本例是单例构造模式 /// </summary> public static SqlParametersCache GetSqlParametersContent { get { return t; } } /** <summary> /// 检索缓冲参数,检索的最终形式为ConnectionString,SqlCommandText /// </summary> /// <param name="ConnectionString">连接数据库的字符串</param> /// <param name="SqlCommandText">存储过程的名称</param> /// <param name="includeReturnValueParameter">是否包含一个ReturnValue的返回数据~~默认的~~讨厌~~~~</param> /// <param name="return">SqlParameter[]返回一个参数集合</param> public SqlParameter[] GetCatchSqlParameter(string ConnectionString, string SqlCommandText, bool includeReturnValueParameter) { string c = ""; if (ConnectionString == null) throw new ArgumentNullException("请输入你的连接字符串"); if (SqlCommandText == null || SqlCommandText.Length == 0) throw new ArgumentNullException("请输入你的存储过程名字"); //--检查集合里面是否有指定数据 if (this.ContainsKey(ConnectionString + ":" + SqlCommandText) != false) { //--有数据的是在返回的时候在判断this[ConnectionString + ":" + SqlCommandText]key里面包含的数据如果不存在--调用this.GoToSqlSererSelectParameter在次找到该数 据 if (this[ConnectionString + ":" + SqlCommandText] == null) { //--再次缓冲这个对象咯~~-调用this.GoToSqlSererSelectParameter找到参数 this[ConnectionString + ":" + SqlCommandText] = this.GoToSqlSererSelectParameter(ConnectionString, SqlCommandText, includeReturnValueParameter); } //--返回数据 return Cps(this[ConnectionString + ":" + SqlCommandText]); } else//-不存在再次缓冲-----key--------------------------------------value-调用this.GoToSqlSererSelectParameter找到参数 this.Add(ConnectionString + ":" + SqlCommandText, this.GoToSqlSererSelectParameter(ConnectionString, SqlCommandText, includeReturnValueParameter)); return this[ConnectionString + ":" + SqlCommandText]; } /** <summary> /// 去Sql中检索存储过程的参数 /// </summary> /// <param name="ConnectionString">检索的字符串</param> /// <param name="SqlCommandText">存储过程的名称</param> /// <param name="includeReturnValueParameter">是否包含一个ReturnValue的返回数据~~默认的~~讨厌~~~~</param> private SqlParameter[] GoToSqlSererSelectParameter(string ConnectionString, string SqlCommandText, bool includeReturnValueParameter) { SqlConnection BugConnection = new SqlConnection(ConnectionString); SqlCommand BugCommand = new SqlCommand(SqlCommandText, BugConnection); try { BugCommand.CommandType = CommandType.StoredProcedure; BugConnection.Open(); //----反向去SqlServer-找到参数----写入到--BugCommand里面 SqlCommandBuilder.DeriveParameters(BugCommand); } catch (SqlException) { } finally { BugConnection.Close(); } //---false不保存删除第一个参数--这个参数是ParameterDirection.ReturnValue类型 if (!includeReturnValueParameter) { if (BugCommand.Parameters[0].Direction == ParameterDirection.ReturnValue) { BugCommand.Parameters.RemoveAt(0); } } //--是否包含返回参数 SqlParameter[] discoveredParameters = new SqlParameter[BugCommand.Parameters.Count]; //---将参数拷贝到参数集合中--要拷贝到的参数集合--从指定目标数组索引处开始 BugCommand.Parameters.CopyTo(discoveredParameters, 0); // Init the parameters with a DBNull value--将对象复空值 foreach (SqlParameter discoveredParameter in discoveredParameters) { try { discoveredParameter.Value = DBNull.Value; } catch (System.Exception) { } } return Cps(discoveredParameters); } //--作用创建对象的副本 private static SqlParameter[] Cps(SqlParameter[] originalParameters) { SqlParameter[] clonedParameters = new SqlParameter[originalParameters.Length]; for (int i = 0, j = originalParameters.Length; i < j; i++) { //----复制构造函数,以便使用当前实例的值初始化Parameter 类的新实例。 clonedParameters[i] = (SqlParameter)((ICloneable)originalParameters[i]).Clone(); } return clonedParameters; } } } Feedback |