微软的SqlHelper做数据层(二)

 
微软的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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值