Beispiel #1
0
        /// <summary>
        /// 执行命令。
        /// </summary>
        /// <param name="command">指定的命令对象。</param>
        /// <param name="operate">当前操作对象。</param>
        /// <returns>执行后的影响行数。</returns>
        public int Execute(DbCommand command, DbOperateBase operate)
        {
            if (_Parameters.Count > 0)
            {
                command.Parameters.AddRange(_Parameters.ToArray());
            }
            var strs = command.CommandText.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);

            if (!(operate is IDbSplitObjectsOperate objects))
            {
                throw new InvalidOperationException();
            }
            var recordsAffectedCount = 0;

            var bodys = _ParameterBody.Values;

            if (operate.HasResult && operate.Output != null)
            {
                var objectsOperate = (DbObjectsOperateBase)operate;
                foreach (var obj in objects)
                {
                    _Loader.Load(obj);
                    foreach (var body in bodys)
                    {
                        body.Parameter.Value = _Loader[body.Index];
                    }
                    var returnCommand = RunSpliteCommand(command, strs, out int affectedCount);
                    using (var reader = returnCommand.ExecuteReader())
                    {
                        objectsOperate.Read(reader, obj);
                        recordsAffectedCount += affectedCount + reader.RecordsAffected;
                    }
                }
            }
            else
            {
                foreach (var obj in objects)
                {
                    _Loader.Load(obj);
                    foreach (var body in bodys)
                    {
                        body.Parameter.Value = _Loader[body.Index];
                    }
                    var returnCommand = RunSpliteCommand(command, strs, out int affectedCount);
                    recordsAffectedCount += affectedCount + returnCommand.ExecuteNonQuery();
                }
            }
            return(recordsAffectedCount);
        }