///// <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; }
/// <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); }