Exemple #1
0
        ///// <summary>
        ///// 构造函数
        ///// </summary>
        ///// <param name="name">命令名称</param>
        ///// <param name="argsObject">参数</param>
        ///// <param name="replaces">替换的键值对集合</param>
        //public XmlCommand(string name, object argsObject, Dictionary<string, string> replaces)
        //{
        //    if (string.IsNullOrEmpty(name))
        //        throw new ArgumentNullException("name");

        //    ClownFish.XmlCommand command = ClownFish.XmlCommandManager.GetCommand(name);
        //    if (command == null)
        //        throw new ArgumentOutOfRangeException("name", string.Format("指定的XmlCommand名称 {0} 不存在。", name));

        //    // 根据XML的定义以及传入参数,生成SqlParameter数组
        //    SqlParameter[] parameters = GetParameters(command, argsObject);

        //    // 创建CPQuery实例
        //    StringBuilder commandText = new StringBuilder(command.CommandText);
        //    if (replaces != null)
        //    {
        //        foreach (KeyValuePair<string, string> kvp in replaces)
        //        {
        //            commandText.Replace(kvp.Key, kvp.Value);
        //        }
        //    }

        //    _query = Panto.Map.Extensions.DAL.CPQuery.From(commandText.ToString(), parameters);
        //    _query.Command.CommandTimeout = command.Timeout;
        //    _query.Command.CommandType = command.CommandType;
        //}

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="name">XmlCommand名称</param>
        /// <param name="argsObject">参数</param>
        /// <param name="tables">联合查询用到的数据库实例名,可以用ConnStringHelper.GetDBName(string key)</param>
        public XmlCommand(string name, object argsObject, params object[] tables)
        {
            if (string.IsNullOrEmpty(name))
            {
                throw new ArgumentNullException("name");
            }

            ClownFish.XmlCommand command = ClownFish.XmlCommandManager.GetCommand(name);
            if (command == null)
            {
                throw new ArgumentOutOfRangeException("name", string.Format("指定的XmlCommand名称 {0} 不存在。", name));
            }

            // 根据XML的定义以及传入参数,生成SqlParameter数组
            SqlParameter[] parameters = GetParameters(command, argsObject);

            // 创建CPQuery实例
            var commandText = new StringBuilder(command.CommandText).ToString();

            if (tables != null && tables.Length > 0)
            {
                commandText = string.Format(commandText, tables);
            }

            _query = Panto.Map.Extensions.DAL.CPQuery.From(commandText, parameters);
            _query.Command.CommandTimeout = command.Timeout;
            _query.Command.CommandType    = command.CommandType;
        }
Exemple #2
0
        /// <summary>
        /// 获取Sql参数集合
        /// </summary>
        /// <param name="command">XmlCommand</param>
        /// <param name="argsObject">参数</param>
        /// <returns>Sql参数集合</returns>
        private SqlParameter[] GetParameters(ClownFish.XmlCommand command, object argsObject)
        {
            if (argsObject == null || command.Parameters.Count == 0)
            {
                return(new SqlParameter[0]);
            }

            // 将XML定义的参数,转成SqlParameter数组。
            SqlParameter[] parameters = (from p in command.Parameters
                                         let p2 = new SqlParameter
            {
                ParameterName = p.Name,
                DbType = p.Type,
                Direction = p.Direction,
                Size = p.Size
            }
                                         select p2).ToArray();

            PropertyInfo[] properties = argsObject.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);

            // 为每个SqlParameter赋值。
            foreach (PropertyInfo pInfo in properties)
            {
                string name = "@" + pInfo.Name;

                // 如果传入了在XML中没有定义的参数项,则会抛出异常。
                SqlParameter p = parameters.FirstOrDefault(x => string.Compare(x.ParameterName, name, StringComparison.OrdinalIgnoreCase) == 0);
                if (p == null)
                {
                    throw new ArgumentException(string.Format("传入的参数对象中,属性 {0} 没有在MXL定义对应的参数名。", pInfo.Name));
                }

                p.Value = pInfo.FastGetValue(argsObject) ?? DBNull.Value;
            }

            return(parameters);
        }