コード例 #1
0
 /// <summary>
 /// 按照目录分页获取指定节点、本体的数据
 /// <remarks>
 /// 如果传入的目录为空则表示获取全部目录的数据
 /// </remarks>
 /// </summary>
 /// <param name="ontology"></param>
 /// <param name="selectElements"></param>
 /// <param name="filters">过滤器列表</param>
 /// <param name="pagingData"></param>
 /// <returns></returns>
 public DataTuple GetPlist(
     OntologyDescriptor ontology,
     OrderedElementSet selectElements,
     List <FilterData> filters,
     PagingInput pagingData)
 {
     return(this.GetPlistInfoItems(
                ontology, this.GetEntityDb(ontology),
                selectElements,
                filters, pagingData));
 }
コード例 #2
0
        /// <summary>
        /// 转换为数据传输对象。
        /// </summary>
        /// <param name="ontology"></param>
        /// <returns></returns>
        public static OntologyData ToOntologyData(this OntologyDescriptor ontology)
        {
            if (ontology == null)
            {
                return(null);
            }
            var ontologyData = new OntologyData()
            {
                Code     = ontology.Ontology.Code,
                Name     = ontology.Ontology.Name,
                IsSystem = ontology.Ontology.IsSystem
            };

            if (ontology.Actions != null && ontology.Actions.Count > 0)
            {
                foreach (var item in ontology.Actions.Values.OrderBy(a => a.Verb))
                {
                    ontologyData.Actions.Add(new ActionData
                    {
                        Verb = item.Verb,
                        Name = item.Name
                    });
                }
            }
            if (ontology.Elements != null && ontology.Elements.Count > 0)
            {
                foreach (var item in ontology.Elements.Values.OrderBy(a => a.Element.SortCode))
                {
                    if (!item.IsRuntimeElement)
                    {
                        InfoDicState infoDic = null;
                        if (item.Element.InfoDicId.HasValue)
                        {
                            ontology.Host.NodeHost.InfoDics.TryGetInfoDic(item.Element.InfoDicId.Value, out infoDic);
                        }
                        var infoDicCode         = infoDic == null ? "" : infoDic.Code;
                        var infoDicName         = infoDic == null ? "" : infoDic.Name;
                        var serializableElement = new ElementData()
                        {
                            Name      = item.Element.Name,
                            Key       = item.Element.Code,
                            Nullable  = item.Element.Nullable,
                            MaxLength = item.Element.MaxLength,
                            OType     = item.Element.OType,
                            ValueDic  = infoDicCode,
                            IsEnabled = item.Element.IsEnabled
                        };
                        ontologyData.Elements.Add(serializableElement);
                    }
                }
            }

            return(ontologyData);
        }
コード例 #3
0
ファイル: DbCmd.cs プロジェクト: mingkongbin/anycmd
 /// <summary>
 /// 
 /// </summary>
 /// <param name = "actionType"></param>
 /// <param name="ontology"></param>
 /// <param name="isDumb"></param>
 /// <param name="client"></param>
 /// <param name="commandId"></param>
 /// <param name="localEntityId"></param>
 /// <param name="infoValue"></param>
 internal DbCmd(DbActionType actionType,
     OntologyDescriptor ontology, bool isDumb, NodeDescriptor client,
     string commandId, string localEntityId, InfoItem[] infoValue)
 {
     this.ActionType = actionType;
     this.Ontology = ontology;
     this.IsDumb = isDumb;
     this.Client = client;
     this.CommandId = commandId;
     this.LocalEntityId = localEntityId;
     this.InfoValue = infoValue;
 }
コード例 #4
0
 /// <summary>
 ///
 /// </summary>
 /// <param name = "actionType"></param>
 /// <param name="ontology"></param>
 /// <param name="isDumb"></param>
 /// <param name="client"></param>
 /// <param name="commandId"></param>
 /// <param name="localEntityId"></param>
 /// <param name="infoValue"></param>
 internal DbCmd(DbActionType actionType,
                OntologyDescriptor ontology, bool isDumb, NodeDescriptor client,
                string commandId, string localEntityId, InfoItem[] infoValue)
 {
     this.ActionType    = actionType;
     this.Ontology      = ontology;
     this.IsDumb        = isDumb;
     this.Client        = client;
     this.CommandId     = commandId;
     this.LocalEntityId = localEntityId;
     this.InfoValue     = infoValue;
 }
コード例 #5
0
        /// <summary>
        /// 保存命令事件
        /// </summary>
        /// <param name="ontology"></param>
        /// <param name="command"></param>
        public ProcessResult SaveCommand(OntologyDescriptor ontology, MessageEntity command)
        {
            if (ontology == null)
            {
                return(new ProcessResult(new ArgumentNullException("ontology", "ontology参数为null")));
            }
            if (command == null)
            {
                return(new ProcessResult(new ArgumentNullException("command")));
            }

            return(this.SaveCommands(ontology, new MessageEntity[] { command }));
        }
コード例 #6
0
 private static InfoItem GetProperty(OntologyDescriptor ontology, string propertyCode, string value)
 {
     if (propertyCode.Equals(ontology.Ontology.Code + "Id", System.StringComparison.OrdinalIgnoreCase))
     {
         propertyCode = "Id";
     }
     ElementDescriptor element;
     if (!ontology.Elements.TryGetValue(propertyCode, out element))
     {
         throw new AnycmdException("意外的" + ontology.Ontology.Name + "实体属性编码" + propertyCode);
     }
     return InfoItem.Create(element, value);
 }
コード例 #7
0
ファイル: ManagedObject.cs プロジェクト: mingkongbin/anycmd
 public ManagedObject(OntologyDescriptor ontology, InfoItem[] entity, InfoItem[] inputValues)
 {
     if (ontology == null)
     {
         throw new ArgumentNullException("ontology");
     }
     if (entity == null)
     {
         throw new ArgumentNullException("entity");
     }
     this.Ontology = ontology;
     this.Entity = entity;
     this.InputValues = inputValues;
 }
コード例 #8
0
        private static InfoItem GetProperty(OntologyDescriptor ontology, string propertyCode, string value)
        {
            if (propertyCode.Equals(ontology.Ontology.Code + "Id", System.StringComparison.OrdinalIgnoreCase))
            {
                propertyCode = "Id";
            }
            ElementDescriptor element;

            if (!ontology.Elements.TryGetValue(propertyCode, out element))
            {
                throw new AnycmdException("意外的" + ontology.Ontology.Name + "实体属性编码" + propertyCode);
            }
            return(InfoItem.Create(element, value));
        }
コード例 #9
0
        /// <summary>
        /// 获取给定本体码和存储标识的本节点的数据
        /// <remarks>本节点通常是中心节点</remarks>
        /// </summary>
        /// <param name="ontology">本体</param>
        /// <param name="localEntityId"></param>
        /// <param name="selectElements"></param>
        /// <returns>数据记录,表现为字典形式,键是数据元素编码值是相应数据元素对应的数据项值</returns>
        public InfoItem[] Get(
            OntologyDescriptor ontology, string localEntityId, OrderedElementSet selectElements)
        {
            var topTwo = GetTopTwo(ontology, new InfoItem[] { InfoItem.Create(ontology.IdElement, localEntityId) }, selectElements);

            if (topTwo.BothHasValue || topTwo.BothNoValue)
            {
                return(new InfoItem[0]);
            }
            else
            {
                return(topTwo.SingleInfoTuple);
            }
        }
コード例 #10
0
ファイル: ManagedObject.cs プロジェクト: HuZeHua/InternetDemo
 public ManagedObject(OntologyDescriptor ontology, InfoItem[] entity, InfoItem[] inputValues)
 {
     if (ontology == null)
     {
         throw new ArgumentNullException("ontology");
     }
     if (entity == null)
     {
         throw new ArgumentNullException("entity");
     }
     this.Ontology    = ontology;
     this.Entity      = entity;
     this.InputValues = inputValues;
 }
コード例 #11
0
        public MessageEntity GetCommand(MessageTypeKind commandType, OntologyDescriptor ontology, Guid id)
        {
            var db          = this.GetCommandDb(ontology);
            var queryString =
                @"select * from " + GetTableName(commandType) + " as a where a.Id=@Id";

            using (var reader = db.ExecuteReader(queryString, CreateParameter(db, "Id", id, DbType.Guid)))
            {
                if (reader.Read())
                {
                    return(CommandRecord.Create(ontology.Host, commandType, reader));
                }
            }

            return(null);
        }
コード例 #12
0
        /// <summary>
        /// 分页查询命令展示对象
        /// </summary>
        /// <typeparam name="T">命令展示模型类型参数</typeparam>
        /// <param name="messageProvider">命令提供程序</param>
        /// <param name="messageTypeKind"></param>
        /// <param name="ontology">本体</param>
        /// <param name="catalogCode">目录码</param>
        /// <param name="actionCode">动作码,空值表示忽略本查询条件</param>
        /// <param name="nodeId">节点标识,空值表示忽略本查询条件</param>
        /// <param name="localEntityId"></param>
        /// <param name="pageIndex">页索引</param>
        /// <param name="pageSize">页尺寸</param>
        /// <param name="sortField">排序字段</param>
        /// <param name="sortOrder">排序方向</param>
        /// <param name="total"></param>
        /// <returns></returns>
        public static IList<MessageTr> GetPlistCommandTrs(
            this IMessageProvider messageProvider, MessageTypeKind messageTypeKind, OntologyDescriptor ontology, string catalogCode, string actionCode
            , Guid? nodeId, string localEntityId, int pageIndex, int pageSize
            , string sortField, string sortOrder, out Int64 total)
        {
            IList<MessageEntity> commands = messageProvider.GetPlistCommands(messageTypeKind,
                    ontology, catalogCode, actionCode, nodeId, localEntityId, pageIndex, pageSize
                    , sortField, sortOrder, out total);
            IList<MessageTr> list = new List<MessageTr>();
            foreach (var command in commands)
            {
                list.Add(MessageTr.Create(ontology.Host, command));
            }

            return list;
        }
コード例 #13
0
        /// <summary>
        /// 分页查询命令展示对象
        /// </summary>
        /// <typeparam name="T">命令展示模型类型参数</typeparam>
        /// <param name="messageProvider">命令提供程序</param>
        /// <param name="messageTypeKind"></param>
        /// <param name="ontology">本体</param>
        /// <param name="catalogCode">目录码</param>
        /// <param name="actionCode">动作码,空值表示忽略本查询条件</param>
        /// <param name="nodeId">节点标识,空值表示忽略本查询条件</param>
        /// <param name="localEntityId"></param>
        /// <param name="pageIndex">页索引</param>
        /// <param name="pageSize">页尺寸</param>
        /// <param name="sortField">排序字段</param>
        /// <param name="sortOrder">排序方向</param>
        /// <param name="total"></param>
        /// <returns></returns>
        public static IList <MessageTr> GetPlistCommandTrs(
            this IMessageProvider messageProvider, MessageTypeKind messageTypeKind, OntologyDescriptor ontology, string catalogCode, string actionCode
            , Guid?nodeId, string localEntityId, int pageIndex, int pageSize
            , string sortField, string sortOrder, out Int64 total)
        {
            IList <MessageEntity> commands = messageProvider.GetPlistCommands(messageTypeKind,
                                                                              ontology, catalogCode, actionCode, nodeId, localEntityId, pageIndex, pageSize
                                                                              , sortField, sortOrder, out total);
            IList <MessageTr> list = new List <MessageTr>();

            foreach (var command in commands)
            {
                list.Add(MessageTr.Create(ontology.Host, command));
            }

            return(list);
        }
コード例 #14
0
            /// <summary>
            ///
            /// </summary>
            public Sql(OntologyDescriptor ontology, string clientId, string commandId, DbActionType actionType, string localEntityId, InfoItem[] infoValue, Func <DbParameter> createParameter)
            {
                this._ontology        = ontology;
                this._localEntityId   = localEntityId;
                this._infoValue       = infoValue;
                this._clientId        = clientId;
                this._commandId       = commandId;
                this._createParameter = createParameter;
                if (ontology == null ||
                    string.IsNullOrEmpty(localEntityId))
                {
                    this.IsValid     = false;
                    this.Description = "命令信息标识或信息值为空或本体为空或本地标识为空";
                    throw new ArgumentNullException("command");
                }
                // 无需把switch流程选择逻辑重构掉,因为actionType枚举不存在变化
                switch (actionType)
                {
                case DbActionType.Insert:
                    if (infoValue == null || infoValue.Length == 0)
                    {
                        this.Description = "命令信息值为空";
                        break;
                    }
                    BuildInsertSql();
                    break;

                case DbActionType.Update:
                    if (infoValue == null || infoValue.Length == 0)
                    {
                        this.Description = "命令信息值为空";
                        break;
                    }
                    BuildUpdateSql();
                    break;

                case DbActionType.Delete:
                    BuildDeleteSql();
                    break;

                default:
                    this.IsValid     = false;
                    this.Description = "意外的不能执行的动作码" + actionType.ToString();
                    break;
                }
            }
コード例 #15
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="html"></param>
        /// <param name="ontology"></param>
        /// <returns></returns>
        public static IHtmlString ActionsJsonArray(this HtmlHelper html, OntologyDescriptor ontology)
        {
            var sb = new StringBuilder();
            sb.Append("[");
            var l = sb.Length;
            foreach (var action in ontology.Actions)
            {
                if (sb.Length != l)
                {
                    sb.Append(",");
                }
                sb.Append("{code:'").Append(action.Key)
                    .Append("',name:'").Append(action.Key).Append(" | ").Append(action.Value.Name).Append("'}");
            }
            sb.Append("]");

            return html.Raw(sb.ToString());
        }
コード例 #16
0
 /// <summary>
 ///
 /// </summary>
 private RdbDescriptor GetCommandDb(OntologyDescriptor ontology)
 {
     if (!_dbDic.ContainsKey(ontology))
     {
         lock (_locker)
         {
             if (!_dbDic.ContainsKey(ontology))
             {
                 RdbDescriptor db;
                 if (!ontology.Host.RdbSet.TryDb(ontology.Ontology.MessageDatabaseId, out db))
                 {
                     throw new GeneralException("意外的数据库Id" + ontology.Ontology.MessageDatabaseId.ToString());
                 }
                 _dbDic.Add(ontology, db);
             }
         }
     }
     return(_dbDic[ontology]);
 }
コード例 #17
0
 /// <summary>
 ///
 /// </summary>
 private RdbDescriptor GetEntityDb(OntologyDescriptor ontology)
 {
     if (!DbDic.ContainsKey(ontology))
     {
         lock (Locker)
         {
             if (!DbDic.ContainsKey(ontology))
             {
                 RdbDescriptor db;
                 if (!ontology.Host.Rdbs.TryDb(ontology.Ontology.EntityDatabaseId, out db))
                 {
                     throw new AnycmdException("意外的数据库Id" + ontology.Ontology.EntityDatabaseId.ToString());
                 }
                 DbDic.Add(ontology, db);
             }
         }
     }
     return(DbDic[ontology]);
 }
コード例 #18
0
        private RdbDescriptor GetArchiveDb(OntologyDescriptor ontology, IArchive archive)
        {
            var entityDb    = this.GetEntityDb(ontology).Database;
            var catalogName = string.Format(
                "Archive{0}{1}_{2}",
                ontology.Ontology.Code,
                archive.ArchiveOn.ToString("yyyyMMdd"),
                archive.NumberId.ToString());
            var datasource = archive.DataSource;
            var userId     = archive.UserId;
            var password   = archive.Password;

            if (string.IsNullOrEmpty(datasource))
            {
                datasource = entityDb.DataSource;
            }
            if (string.IsNullOrEmpty(userId))
            {
                userId = entityDb.UserId;
            }
            if (string.IsNullOrEmpty(password))
            {
                password = entityDb.Password;
            }

            return(new RdbDescriptor(ontology.Host, new RDatabase
            {
                CatalogName = catalogName,
                CreateBy = archive.CreateBy,
                CreateOn = DateTime.Now,
                CreateUserId = archive.CreateUserId,
                DataSource = datasource,
                Description = ontology.Ontology.Name + "归档",
                Id = Guid.NewGuid(),
                IsTemplate = false,
                Password = password,
                Profile = entityDb.Profile,
                ProviderName = entityDb.ProviderName,
                RdbmsType = archive.RdbmsType,
                UserId = userId
            }));
        }
コード例 #19
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="html"></param>
        /// <param name="ontology"></param>
        /// <returns></returns>
        public static IHtmlString ActionsJsonArray(this HtmlHelper html, OntologyDescriptor ontology)
        {
            var sb = new StringBuilder();

            sb.Append("[");
            var l = sb.Length;

            foreach (var action in ontology.Actions)
            {
                if (sb.Length != l)
                {
                    sb.Append(",");
                }
                sb.Append("{code:'").Append(action.Key)
                .Append("',name:'").Append(action.Key).Append(" | ").Append(action.Value.Name).Append("'}");
            }
            sb.Append("]");

            return(html.Raw(sb.ToString()));
        }
コード例 #20
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="ontology"></param>
        /// <param name="archive"></param>
        public void Archive(OntologyDescriptor ontology, IArchive archive)
        {
            var entityDb  = this.GetEntityDb(ontology).Database;
            var archiveDb = this.GetArchiveDb(ontology, archive);

            if (archiveDb.Database.CatalogName.Equals(entityDb.CatalogName, StringComparison.OrdinalIgnoreCase))
            {
                throw new AnycmdException("归档库的数据库名不能与本体库相同");
            }
            // 创建归档库
            archiveDb.Create(this.GetEntityDb(ontology), ontology.Host.Config.EntityArchivePath);
            string archiveTableName = string.Format(
                "{0}.{1}.{2}", archiveDb.Database.CatalogName, ontology.Ontology.EntitySchemaName, ontology.Ontology.EntityTableName);
            string sql =
                @"if OBJECT_ID('" + archiveTableName + "') IS NULL select * into " + archiveTableName
                + " from " + ontology.Ontology.EntityTableName;

            // 执行select into归档数据
            this.GetEntityDb(ontology).ExecuteNonQuery(sql, null);
        }
コード例 #21
0
ファイル: EntityProvider.cs プロジェクト: mingkongbin/anycmd
        /// <summary>
        /// 获取给定本体码和存储标识的本节点的数据
        /// <remarks>本节点通常是中心节点</remarks>
        /// </summary>
        /// <param name="ontology">本体</param>
        /// <param name="localEntityId"></param>
        /// <param name="selectElements"></param>
        /// <returns>数据记录,表现为字典形式,键是数据元素编码值是相应数据元素对应的数据项值</returns>
        public InfoItem[] Get(
			OntologyDescriptor ontology, string localEntityId, OrderedElementSet selectElements)
        {
            var topTwo = GetTopTwo(ontology, new InfoItem[] { InfoItem.Create(ontology.IdElement, localEntityId) }, selectElements);
            if (topTwo.BothHasValue || topTwo.BothNoValue)
            {
                return new InfoItem[0];
            }
            else
            {
                return topTwo.SingleInfoTuple;
            }
        }
コード例 #22
0
        /// <summary>
        /// 根据给定的本体码和信息标识获取本节点两条数据
        /// </summary>
        /// <param name="ontology">本体</param>
        /// <param name="db"></param>
        /// <param name="infoIds">多列联合信息标识字典,键必须不区分大小写</param>
        /// <param name="selectElements">选择元素</param>
        /// <returns></returns>
        private TowInfoTuple GetTop2InfoItemSet(OntologyDescriptor ontology,
                                                RdbDescriptor db, IEnumerable <InfoItem> infoIds, OrderedElementSet selectElements)
        {
            if (infoIds == null || !infoIds.Any())
            {
                return(new TowInfoTuple(null, null));
            }

            var sb            = new StringBuilder();
            var sqlParameters = new List <DbParameter>();
            var elementList   = selectElements.ToList();

            sb.Append("select top 2 ");
            int l = sb.Length;

            foreach (var element in elementList)
            {
                if (sb.Length != l)
                {
                    sb.Append(",");
                }
                sb.Append("t.[").Append(element.Element.FieldCode).Append("]");
            }
            sb.Append(" from [").Append(ontology.Ontology.EntityTableName).Append("] as t where");
            if (ontology.Ontology.IsLogicalDeletionEntity)
            {
                sb.Append(" t.DeletionStateCode=0 ");
            }
            else
            {
                sb.Append(" 1=1 ");
            }
            foreach (var element in infoIds)
            {
                sb.Append(" and t.[").Append(element.Element.Element.FieldCode)
                .Append("]=").Append("@").Append(element.Element.Element.FieldCode);
                object obj = element.Value;
                if (obj == null)
                {
                    obj = DBNull.Value;
                }
                sqlParameters.Add(CreateParameter(db, element.Element.Element.FieldCode, obj, DbType.String));
            }
            var infoValue1 = new List <InfoItem>();
            var infoValue2 = new List <InfoItem>();

            using (var reader = db.ExecuteReader(sb.ToString(), sqlParameters.ToArray()))
            {
                if (reader.Read())
                {
                    for (int i = 0; i < elementList.Count; i++)
                    {
                        infoValue1.Add(InfoItem.Create(elementList[i], reader.GetValue(i).ToString()));
                    }
                }
                if (reader.Read())
                {
                    for (int i = 0; i < elementList.Count; i++)
                    {
                        infoValue2.Add(InfoItem.Create(elementList[i], reader.GetValue(i).ToString()));
                    }
                }
                reader.Close();
            }

            return(new TowInfoTuple(infoValue1.ToArray(), infoValue2.ToArray()));
        }
コード例 #23
0
        /// <summary>
        /// 获取给定实体标识列表中的标识标识的每一个实体元组
        /// </summary>
        /// <param name="ontology"></param>
        /// <param name="selectElements"></param>
        /// <param name="entityIDs"></param>
        /// <returns></returns>
        public DataTuple GetList(OntologyDescriptor ontology, OrderedElementSet selectElements, List <string> entityIDs)
        {
            if (ontology == null)
            {
                throw new ArgumentNullException("ontology");
            }
            if (selectElements == null)
            {
                throw new ArgumentNullException("selectElements");
            }
            if (entityIDs == null || entityIDs.Count == 0)
            {
                throw new ArgumentException("entityId");
            }
            var ids = new StringBuilder("(");
            int len = ids.Length;

            foreach (var id in entityIDs)
            {
                if (ids.Length != len)
                {
                    ids.Append(",");
                }
                ids.Append("'").Append(id).Append("'");
            }
            ids.Append(")");
            var tableName = ontology.Ontology.EntityTableName;

            if (selectElements.Count == 0)
            {
                selectElements.Add(ontology.Elements[ontology.IdElement.Element.Code]);
            }
            var sqlQuery = new StringBuilder("select ");
            int l        = sqlQuery.Length;

            foreach (var item in selectElements)
            {
                if (sqlQuery.Length != l)
                {
                    sqlQuery.Append(",");
                }
                sqlQuery.Append("t.[").Append(item.Element.Code).Append("]");
            }
            sqlQuery.Append(" from [").Append(tableName).Append("] as t where t.[")
            .Append(ontology.IdElement.Element.Code).Append("] in ").Append(ids.ToString());                    // TODO:参数化EntityIDs
            var list   = new List <object[]>();
            var reader = this.GetEntityDb(ontology).ExecuteReader(sqlQuery.ToString());

            while (reader.Read())
            {
                var values = new object[selectElements.Count];
                for (int i = 0; i < selectElements.Count; i++)
                {
                    values[i] = reader.GetValue(i);
                }
                list.Add(values);
            }
            reader.Close();

            return(new DataTuple(selectElements, list.ToArray()));
        }
コード例 #24
0
 public TowInfoTuple GetTopTwo(
     OntologyDescriptor ontology, IEnumerable <InfoItem> infoIDs, OrderedElementSet selectElements)
 {
     return(GetTop2InfoItemSet(ontology, this.GetEntityDb(ontology), infoIDs, selectElements));
 }
コード例 #25
0
 public string GetEntityDataSource(OntologyDescriptor ontology)
 {
     return(this.GetEntityDb(ontology).IsLocalhost ? "localhost"
                                 : this.GetEntityDb(ontology).Database.DataSource);
 }
コード例 #26
0
        public IEnumerable <InfoItem> GetValues(OntologyDescriptor ontology)
        {
            var properties = this.GetType().GetProperties(BindingFlags.Public & BindingFlags.SetProperty);

            return(properties.Select(property => GetProperty(ontology, property.Name, property.GetValue(this).ToString())));
        }
コード例 #27
0
ファイル: MessageProvider.cs プロジェクト: mingkongbin/anycmd
        /// <summary>
        /// 保存命令事件
        /// </summary>
        /// <param name="ontology"></param>
        /// <param name="command"></param>
        public ProcessResult SaveCommand(OntologyDescriptor ontology, MessageEntity command)
        {
            if (ontology == null)
            {
                return new ProcessResult(new ArgumentNullException("ontology", "ontology参数为null"));
            }
            if (command == null)
            {
                return new ProcessResult(new ArgumentNullException("command"));
            }

            return this.SaveCommands(ontology, new MessageEntity[] { command });
        }
コード例 #28
0
        /// <summary>
        /// 单条删除
        /// </summary>
        /// <param name="ontology"></param>
        /// <param name="id">单条数据的Guid信息标识</param>
        /// <returns></returns>
        private IMessageDto DeleteEntity(OntologyDescriptor ontology, Guid id)
        {
            const string actionCode = "delete";
            var node = AcDomain.NodeHost.Nodes.ThisNode;
            var ticks = DateTime.UtcNow.Ticks;
            var cmd = new Message()
            {
                Version = ApiVersion.V1.ToName(),
                IsDumb = false,
                MessageType = MessageType.Action.ToName(),
                Credential = new CredentialData
                {
                    ClientType = ClientType.Node.ToName(),
                    UserType = UserType.None.ToName(),
                    CredentialType = CredentialType.Token.ToName(),
                    ClientId = node.Node.Id.ToString(),
                    UserName = AcSession.Account.Id.ToString(),// UserName
                    Password = TokenObject.Token(node.Node.Id.ToString(), ticks, node.Node.SecretKey),
                    Ticks = ticks
                },
                Verb = actionCode,
                Ontology = ontology.Ontology.Code,
                TimeStamp = DateTime.UtcNow.Ticks,
                MessageId = Guid.NewGuid().ToString(),
                Body = new BodyData(new KeyValue[] { new KeyValue("Id", id.ToString()) }, new KeyValue[0])
                {
                    Event = new EventData
                    {
                        Status = (int)Status.ReceiveOk,
                        ReasonPhrase = Status.ReceiveOk.ToName()
                    }
                }
            };

            return AnyMessage.Create(HecpRequest.Create(AcDomain, cmd), AcDomain.NodeHost.Nodes.ThisNode).Response();
        }
コード例 #29
0
ファイル: EntityProvider.cs プロジェクト: mingkongbin/anycmd
        /// <summary>
        /// 按照目录分页获取指定节点、本体的数据
        /// <remarks>
        /// 如果传入的目录为空则表示获取全部目录的数据
        /// </remarks>
        /// </summary>
        /// <param name="ontology"></param>
        /// <param name="selectElements"></param>
        /// <param name="filters">过滤器列表</param>
        /// <param name="pagingData"></param>
        /// <returns></returns>
        public DataTuple GetPlist(
			OntologyDescriptor ontology,
			OrderedElementSet selectElements,
			List<FilterData> filters,
			PagingInput pagingData)
        {
            return this.GetPlistInfoItems(
                ontology, this.GetEntityDb(ontology),
                selectElements,
                filters, pagingData);
        }
コード例 #30
0
 private bool ValidCatalogCode(OntologyDescriptor ontology, string catalogCode, out CatalogState org, out ProcessResult result)
 {
     if (string.IsNullOrEmpty(catalogCode))
     {
         org = CatalogState.Empty;
         result = ProcessResult.Ok;
         return false;
     }
     if (!ontology.Host.CatalogSet.TryGetCatalog(catalogCode.Trim(), out org))
     {
         result = new ProcessResult(false, Status.InvalidCatalog, string.Format("非法的目录码{0}", catalogCode));
         return false;
     }
     OntologyCatalogState oorg;
     if (!ontology.Catalogs.TryGetValue(org, out oorg))
     {
         result = new ProcessResult(false, Status.InvalidCatalog, string.Format("对于{0}来说{1}是非法的目录码", ontology.Ontology.Name, org.Code));
         return false;
     }
     var orgCode = org.Code;
     if (ontology.Host.CatalogSet.Any(o => orgCode.Equals(o.ParentCode, StringComparison.OrdinalIgnoreCase)))
     {
         result = new ProcessResult(false, Status.InvalidCatalog, string.Format("{0}不是叶节点,不能容纳" + ontology.Ontology.Name, org.Name));
         return false;
     }
     result = ProcessResult.Ok;
     return true;
 }
コード例 #31
0
ファイル: EntityProvider.cs プロジェクト: mingkongbin/anycmd
 /// <summary>
 /// 
 /// </summary>
 public Sql(OntologyDescriptor ontology, string clientId, string commandId, DbActionType actionType, string localEntityId, InfoItem[] infoValue, Func<DbParameter> createParameter)
 {
     this._ontology = ontology;
     this._localEntityId = localEntityId;
     this._infoValue = infoValue;
     this._clientId = clientId;
     this._commandId = commandId;
     this._createParameter = createParameter;
     if (ontology == null
         || string.IsNullOrEmpty(localEntityId))
     {
         this.IsValid = false;
         this.Description = "命令信息标识或信息值为空或本体为空或本地标识为空";
         throw new ArgumentNullException("command");
     }
     // 无需把switch流程选择逻辑重构掉,因为actionType枚举不存在变化
     switch (actionType)
     {
         case DbActionType.Insert:
             if (infoValue == null || infoValue.Length == 0)
             {
                 this.Description = "命令信息值为空";
                 break;
             }
             BuildInsertSql();
             break;
         case DbActionType.Update:
             if (infoValue == null || infoValue.Length == 0)
             {
                 this.Description = "命令信息值为空";
                 break;
             }
             BuildUpdateSql();
             break;
         case DbActionType.Delete:
             BuildDeleteSql();
             break;
         default:
             this.IsValid = false;
             this.Description = "意外的不能执行的动作码" + actionType.ToString();
             break;
     }
 }
コード例 #32
0
ファイル: EntityProvider.cs プロジェクト: mingkongbin/anycmd
        /// <summary>
        /// 根据给定的本体码和信息标识获取本节点两条数据
        /// </summary>
        /// <param name="ontology">本体</param>
        /// <param name="db"></param>
        /// <param name="infoIds">多列联合信息标识字典,键必须不区分大小写</param>
        /// <param name="selectElements">选择元素</param>
        /// <returns></returns>
        private TowInfoTuple GetTop2InfoItemSet(OntologyDescriptor ontology,
			RdbDescriptor db, IEnumerable<InfoItem> infoIds, OrderedElementSet selectElements)
        {
            if (infoIds == null || !infoIds.Any())
            {
                return new TowInfoTuple(null, null);
            }

            var sb = new StringBuilder();
            var sqlParameters = new List<DbParameter>();
            var elementList = selectElements.ToList();
            sb.Append("select top 2 ");
            int l = sb.Length;
            foreach (var element in elementList)
            {
                if (sb.Length != l)
                {
                    sb.Append(",");
                }
                sb.Append("t.[").Append(element.Element.FieldCode).Append("]");
            }
            sb.Append(" from [").Append(ontology.Ontology.EntityTableName).Append("] as t where");
            if (ontology.Ontology.IsLogicalDeletionEntity)
            {
                sb.Append(" t.DeletionStateCode=0 ");
            }
            else
            {
                sb.Append(" 1=1 ");
            }
            foreach (var element in infoIds)
            {
                sb.Append(" and t.[").Append(element.Element.Element.FieldCode)
                    .Append("]=").Append("@").Append(element.Element.Element.FieldCode);
                object obj = element.Value;
                if (obj == null)
                {
                    obj = DBNull.Value;
                }
                sqlParameters.Add(CreateParameter(db, element.Element.Element.FieldCode, obj, DbType.String));
            }
            var infoValue1 = new List<InfoItem>();
            var infoValue2 = new List<InfoItem>();
            using (var reader = db.ExecuteReader(sb.ToString(), sqlParameters.ToArray()))
            {
                if (reader.Read())
                {
                    for (int i = 0; i < elementList.Count; i++)
                    {
                        infoValue1.Add(InfoItem.Create(elementList[i], reader.GetValue(i).ToString()));
                    }
                }
                if (reader.Read())
                {
                    for (int i = 0; i < elementList.Count; i++)
                    {
                        infoValue2.Add(InfoItem.Create(elementList[i], reader.GetValue(i).ToString()));
                    }
                }
                reader.Close();
            }

            return new TowInfoTuple(infoValue1.ToArray(), infoValue2.ToArray());
        }
コード例 #33
0
ファイル: EntityProvider.cs プロジェクト: mingkongbin/anycmd
        /// <summary>
        /// 根据目录获取给定节点和本体的数据,如果传入的目录为空表示获取本节点的数据
        /// <remarks>本节点通常是中心节点</remarks>
        /// </summary>
        /// <param name="ontology"></param>
        /// <param name="db">模型</param>
        /// <param name="filters"></param>
        /// <param name="selectElements">sql select语句的选择列集合</param>
        /// <param name="pagingData"></param>
        /// <returns>
        /// 数据记录列表,数据记录表现为字典形式,键是数据元素编码值是相应数据元素对应的数据项值
        /// </returns>
        private DataTuple GetPlistInfoItems(
			OntologyDescriptor ontology,
			RdbDescriptor db, OrderedElementSet selectElements, List<FilterData> filters,
			PagingInput pagingData)
        {
            if (string.IsNullOrEmpty(pagingData.SortField))
            {
                pagingData.SortField = "IncrementId";
            }
            if (string.IsNullOrEmpty(pagingData.SortOrder))
            {
                pagingData.SortOrder = "asc";
            }

            var elements = ontology.Elements;
            if (filters != null)
            {
                for (int i = 0; i < filters.Count; i++)
                {
                    var filter = filters[i];
                    if (elements.ContainsKey(filter.field))
                    {
                        // TODO:根据数据属性优化查询,比如对于身份证件号来说如果输入的值长度
                        // 为20或18的话可以将like替换为等于
                        filter.type = "string";
                        var element = elements[filter.field];
                        if (element.Element.IsEnabled != 1)
                        {
                            continue;
                        }
                        if (element.Element.InfoDicId.HasValue)
                        {
                            filter.comparison = "eq";
                        }
                        else
                        {
                            filter.comparison = "like";
                        }
                    }
                    else
                    {
                        filters.RemoveAt(i);
                    }
                }
            }

            var tableName = ontology.Ontology.EntityTableName;
            var sbSqlPredicate = new StringBuilder();
            var l = sbSqlPredicate.Length;

            var pQueryList = new List<DbParameter>();
            List<DbParameter> pFilters;
            var filterString = _filterStringBuilder.FilterString(db, filters, null, out pFilters);
            if (!string.IsNullOrEmpty(filterString))
            {
                foreach (var pFilter in pFilters)
                {
                    object obj = pFilter.Value;
                    if (obj == null)
                    {
                        obj = DBNull.Value;
                    }
                    var p = db.CreateParameter();
                    p.ParameterName = pFilter.ParameterName;
                    p.Value = obj;
                    pQueryList.Add(p);
                }
                if (sbSqlPredicate.Length != l)
                {
                    sbSqlPredicate.Append(" and ");
                }
                sbSqlPredicate.Append(filterString);
            }

            string sqlPredicateString = string.Empty;
            if (sbSqlPredicate.Length > 0)
            {
                sqlPredicateString = sbSqlPredicate.ToString();
            }
            var sqlText = new StringBuilder();
            OrderedElementSet elementList;
            if (selectElements == null || selectElements.Count == 0)
            {
                elementList = new OrderedElementSet { ontology.Elements["id"] };
            }
            else
            {
                elementList = selectElements;
            }
            sqlText.Append("SELECT TOP {0} ");
            int len = sqlText.Length;

            foreach (var element in elementList)
            {
                if (sqlText.Length != len)
                {
                    sqlText.Append(",");
                }
                sqlText.Append("[").Append(element.Element.FieldCode).Append("]");
            }

            sqlText.Append(" FROM (SELECT ROW_NUMBER() OVER(ORDER BY {1} {2}) AS RowNumber,");
            len = sqlText.Length;

            foreach (var element in elementList)
            {
                if (sqlText.Length != len)
                {
                    sqlText.Append(",");
                }
                sqlText.Append("[").Append(element.Element.FieldCode).Append("]");
            }

            sqlText.Append(" FROM {3} where ");
            if (ontology.Ontology.IsLogicalDeletionEntity)
            {
                sqlText.Append("DeletionStateCode = 0");
            }
            else
            {
                sqlText.Append("1 = 1");
            }
            if (!string.IsNullOrEmpty(sqlPredicateString))
            {
                sqlText.Append(" and ").Append(sqlPredicateString);
            }
            sqlText.Append(") a WHERE a.RowNumber > {4}");
            string sqlQuery = string.Format(
                sqlText.ToString(),
                pagingData.PageSize.ToString(CultureInfo.InvariantCulture),
                pagingData.SortField,
                pagingData.SortOrder,
                tableName,
                (pagingData.SkipCount).ToString(CultureInfo.InvariantCulture));

            pagingData.Count(() =>
            {
                string where = ontology.Ontology.IsLogicalDeletionEntity ? "where DeletionStateCode = 0" : "";
                string sqlCount = string.Format("select count(1) from {0} {1}", tableName, where);
                if (!string.IsNullOrEmpty(sqlPredicateString))
                {
                    sqlCount = sqlCount + " and " + sqlPredicateString;
                }
                return (int)db.ExecuteScalar(
                    sqlCount, pQueryList.Select(p => ((ICloneable)p).Clone()).Cast<DbParameter>().ToArray());
            });

            var list = new List<object[]>();
            var reader = db.ExecuteReader(sqlQuery, pQueryList.ToArray());
            while (reader.Read())
            {
                var values = new object[elementList.Count];
                for (int i = 0; i < elementList.Count; i++)
                {
                    values[i] = reader.GetValue(i);
                }
                list.Add(values);
            }
            reader.Close();

            return new DataTuple(elementList, list.ToArray());
        }
コード例 #34
0
ファイル: EntityProvider.cs プロジェクト: mingkongbin/anycmd
 /// <summary>
 /// 
 /// </summary>
 private RdbDescriptor GetEntityDb(OntologyDescriptor ontology)
 {
     if (!DbDic.ContainsKey(ontology))
     {
         lock (Locker)
         {
             if (!DbDic.ContainsKey(ontology))
             {
                 RdbDescriptor db;
                 if (!ontology.Host.Rdbs.TryDb(ontology.Ontology.EntityDatabaseId, out db))
                 {
                     throw new AnycmdException("意外的数据库Id" + ontology.Ontology.EntityDatabaseId.ToString());
                 }
                 DbDic.Add(ontology, db);
             }
         }
     }
     return DbDic[ontology];
 }
コード例 #35
0
ファイル: EntityProvider.cs プロジェクト: mingkongbin/anycmd
        private RdbDescriptor GetArchiveDb(OntologyDescriptor ontology, IArchive archive)
        {
            var entityDb = this.GetEntityDb(ontology).Database;
            var catalogName = string.Format(
                            "Archive{0}{1}_{2}",
                            ontology.Ontology.Code,
                            archive.ArchiveOn.ToString("yyyyMMdd"),
                            archive.NumberId.ToString());
            var datasource = archive.DataSource;
            var userId = archive.UserId;
            var password = archive.Password;
            if (string.IsNullOrEmpty(datasource))
            {
                datasource = entityDb.DataSource;
            }
            if (string.IsNullOrEmpty(userId))
            {
                userId = entityDb.UserId;
            }
            if (string.IsNullOrEmpty(password))
            {
                password = entityDb.Password;
            }

            return new RdbDescriptor(ontology.Host, new RDatabase
            {
                CatalogName = catalogName,
                CreateBy = archive.CreateBy,
                CreateOn = DateTime.Now,
                CreateUserId = archive.CreateUserId,
                DataSource = datasource,
                Description = ontology.Ontology.Name + "归档",
                Id = Guid.NewGuid(),
                IsTemplate = false,
                Password = password,
                Profile = entityDb.Profile,
                ProviderName = entityDb.ProviderName,
                RdbmsType = archive.RdbmsType,
                UserId = userId
            });
        }
コード例 #36
0
ファイル: EntityProvider.cs プロジェクト: mingkongbin/anycmd
 public string GetEntityDataSource(OntologyDescriptor ontology)
 {
     return this.GetEntityDb(ontology).IsLocalhost ? "localhost"
             : this.GetEntityDb(ontology).Database.DataSource;
 }
コード例 #37
0
        /// <summary>
        /// 保存新数据
        /// </summary>
        /// <param name="ontology"></param>
        /// <param name="infoIDs"></param>
        /// <param name="infoValues"></param>
        /// <param name="id"></param>
        /// <returns>命令状态模型</returns>
        /// <exception cref="AnycmdException">如果传入的信息ID字典或信息值字典为空则引发该异常,如果信息值
        /// 字典不为空但仅包含一个键为Id的值则也引发本异常(Id应出现在信息标识中是不应该出现在信息值中的)
        /// </exception>
        private IMessageDto Save(OntologyDescriptor ontology
			, IList<InfoItem> infoIDs, IList<InfoItem> infoValues, out string id)
        {
            return SaveOrUpdate(false, ontology, infoIDs, infoValues, out id);
        }
コード例 #38
0
ファイル: OntologyTr.cs プロジェクト: mingkongbin/anycmd
 public static OntologyTr Create(OntologyDescriptor ontology)
 {
     return new OntologyTr
     {
         CanAction = ontology.Ontology.CanAction,
         CanCommand = ontology.Ontology.CanCommand,
         CanEvent = ontology.Ontology.CanEvent,
         Code = ontology.Ontology.Code,
         CreateOn = ontology.Ontology.CreateOn,
         DispatcherLoadCount = ontology.Ontology.DispatcherLoadCount,
         DispatcherSleepTimeSpan = ontology.Ontology.DispatcherSleepTimeSpan,
         EntityDatabaseId = ontology.Ontology.EntityDatabaseId,
         EntitySchemaName = ontology.Ontology.EntitySchemaName,
         EntityTableName = ontology.Ontology.EntityTableName,
         ExecutorLoadCount = ontology.Ontology.ExecutorLoadCount,
         ExecutorSleepTimeSpan = ontology.Ontology.ExecutorSleepTimeSpan,
         Icon = ontology.Ontology.Icon,
         Id = ontology.Ontology.Id,
         IsEnabled = ontology.Ontology.IsEnabled,
         IsLogicalDeletionEntity = ontology.Ontology.IsLogicalDeletionEntity,
         IsCataloguedEntity = ontology.Ontology.IsCataloguedEntity,
         IsSystem = ontology.Ontology.IsSystem,
         MessageDatabaseId = ontology.Ontology.MessageDatabaseId,
         MessageSchemaName = ontology.Ontology.MessageSchemaName,
         Name = ontology.Ontology.Name,
         ServiceIsAlive = ontology.Ontology.ServiceIsAlive,
         SortCode = ontology.Ontology.SortCode
     };
 }
コード例 #39
0
        /// <summary>
        /// 保存新数据或更新旧数据
        /// </summary>
        /// <param name="isUpdate"></param>
        /// <param name="ontology"></param>
        /// <param name="infoIDs"></param>
        /// <param name="infoValues"></param>
        /// <param name="id"></param>
        /// <returns></returns>
        private IMessageDto SaveOrUpdate(bool isUpdate, OntologyDescriptor ontology
			, ICollection<InfoItem> infoIDs, ICollection<InfoItem> infoValues, out string id)
        {
            id = string.Empty;
            if (infoIDs == null || infoIDs.Count == 0)
            {
                throw new AnycmdException("infoIDs不能为空");
            }
            if (infoValues == null || infoValues.Count == 0)
            {
                throw new AnycmdException("infoValues不能为空");
            }
            if (!isUpdate)
            {
                var idItem = infoIDs.FirstOrDefault(a => a.Element == ontology.IdElement);
                if (idItem != null)
                {
                    infoIDs.Remove(idItem);
                }
            }

            IInfoStringConverter converter;
            if (!AcDomain.NodeHost.InfoStringConverters.TryGetInfoStringConverter(AcDomain.Config.InfoFormat, out converter))
            {
                throw new ValidationException("意外的信息字符串转化器,json信息格式转化器不存在或已被禁用");
            }
            var node = AcDomain.NodeHost.Nodes.ThisNode;
            var ticks = DateTime.UtcNow.Ticks;
            var cmd = new Message()
            {
                Version = ApiVersion.V1.ToName(),
                IsDumb = false,
                MessageType = MessageType.Action.ToName(),
                Credential = new CredentialData
                {
                    ClientType = ClientType.Node.ToName(),
                    UserType = UserType.None.ToName(),
                    CredentialType = CredentialType.Token.ToName(),
                    ClientId = node.Node.Id.ToString(),
                    UserName = AcSession.Account.Id.ToString(),// UserName
                    Password = TokenObject.Token(node.Node.Id.ToString(), ticks, node.Node.SecretKey),
                    Ticks = ticks
                },
                MessageId = Guid.NewGuid().ToString(),
                Verb = isUpdate ? "update" : "create",
                Ontology = ontology.Ontology.Code,
                TimeStamp = DateTime.UtcNow.Ticks,
                Body = new BodyData(infoIDs.Select(a => new KeyValue(a.Key, a.Value)).ToArray(), infoValues.Select(a => new KeyValue(a.Key, a.Value)).ToArray())
                {
                    Event = new EventData
                    {
                        Status = (int)Status.ReceiveOk,
                        ReasonPhrase = Status.ReceiveOk.ToName()
                    }
                }
            };
            var result = AnyMessage.Create(HecpRequest.Create(AcDomain, cmd), AcDomain.NodeHost.Nodes.ThisNode).Response();
            id = result.Body.InfoValue.Single(a => a.Key.Equals("Id", StringComparison.OrdinalIgnoreCase)).Value;

            return result;
        }
コード例 #40
0
ファイル: MessageProvider.cs プロジェクト: mingkongbin/anycmd
        /// <summary>
        /// 获取给定条目的给定类型的命令
        /// </summary>
        /// <param name="commandType"></param>
        /// <param name="ontology"></param>
        /// <param name="n">条数</param>
        /// <param name="sortField"></param>
        /// <param name="sortOrder"></param>
        /// <returns>命令消息集合</returns>
        public IList<MessageEntity> GetTopNCommands(MessageTypeKind commandType, OntologyDescriptor ontology, int n, string sortField, string sortOrder)
        {
            if (ontology == null)
            {
                return new List<MessageEntity>();
            }
            if (commandType == MessageTypeKind.Invalid || commandType == MessageTypeKind.AnyCommand)
            {
                return new List<MessageEntity>();
            }
            var db = this.GetCommandDb(ontology);
            var sql =
            @"select top " + n.ToString(CultureInfo.InvariantCulture) +
            " * from [" + GetTableName(commandType) + "] as c where lower(c.Ontology)=@Ontology order by c." + sortField + " " + sortOrder;
            var pOntology = CreateParameter(db, "Ontology", ontology.Ontology.Code.ToLower(), DbType.String);
            IList<MessageEntity> list = new List<MessageEntity>();
            using (var reader = db.ExecuteReader(sql, pOntology))
            {
                while (reader.Read())
                {
                    list.Add(CommandRecord.Create(ontology.Host, commandType, reader));
                }
                reader.Close();

                return list;
            }
        }
コード例 #41
0
        /// <summary>
        /// 更新旧数据。调用者需自己找数据的变化,传入的infoValues是变化的数据
        /// </summary>
        /// <param name="ontology"></param>
        /// <param name="infoIDs"></param>
        /// <param name="infoValues"></param>
        /// <returns>命令状态模型</returns>
        /// <exception cref="AnycmdException">如果传入的信息ID字典或信息值字典为空则引发该异常,如果信息值
        /// 字典不为空但仅包含一个键为Id的值则也引发本异常(Id应出现在信息标识中是不应该出现在信息值中的)
        /// </exception>
        private IMessageDto Update(OntologyDescriptor ontology
			, IList<InfoItem> infoIDs, IList<InfoItem> infoValues)
        {
            string id;
            return SaveOrUpdate(true, ontology, infoIDs, infoValues, out id);
        }
コード例 #42
0
ファイル: MessageProvider.cs プロジェクト: mingkongbin/anycmd
        public ProcessResult DeleteCommand(MessageTypeKind commandType, OntologyDescriptor ontology, Guid id, bool isDumb)
        {
            ProcessResult r;
            if (isDumb)
            {
                r = ProcessResult.Ok;
            }
            else
            {
                var db = this.GetCommandDb(ontology);
                var queryString =
            @"delete " + GetTableName(commandType) + " where Id=@Id";
                int n = db.ExecuteNonQuery(queryString, CreateParameter(db, "Id", id, DbType.Guid));
                if (n == 1)
                {
                    r = ProcessResult.Ok;
                }
                else
                {
                    r = new ProcessResult(new AnycmdException("意外的影响行数" + n.ToString(CultureInfo.InvariantCulture)));
                }
            }

            if (r.Exception != null)
            {
                ontology.Host.LoggingService.Error(r.Exception);
            }

            return r;
        }
コード例 #43
0
ファイル: EntityProvider.cs プロジェクト: mingkongbin/anycmd
        /// <summary>
        /// 获取给定实体标识列表中的标识标识的每一个实体元组
        /// </summary>
        /// <param name="ontology"></param>
        /// <param name="selectElements"></param>
        /// <param name="entityIDs"></param>
        /// <returns></returns>
        public DataTuple GetList(OntologyDescriptor ontology, OrderedElementSet selectElements, List<string> entityIDs)
        {
            if (ontology == null)
            {
                throw new ArgumentNullException("ontology");
            }
            if (selectElements == null)
            {
                throw new ArgumentNullException("selectElements");
            }
            if (entityIDs == null || entityIDs.Count == 0)
            {
                throw new ArgumentException("entityId");
            }
            var ids = new StringBuilder("(");
            int len = ids.Length;
            foreach (var id in entityIDs)
            {
                if (ids.Length != len)
                {
                    ids.Append(",");
                }
                ids.Append("'").Append(id).Append("'");
            }
            ids.Append(")");
            var tableName = ontology.Ontology.EntityTableName;
            if (selectElements.Count == 0)
            {
                selectElements.Add(ontology.Elements[ontology.IdElement.Element.Code]);
            }
            var sqlQuery = new StringBuilder("select ");
            int l = sqlQuery.Length;
            foreach (var item in selectElements)
            {
                if (sqlQuery.Length != l)
                {
                    sqlQuery.Append(",");
                }
                sqlQuery.Append("t.[").Append(item.Element.Code).Append("]");
            }
            sqlQuery.Append(" from [").Append(tableName).Append("] as t where t.[")
                .Append(ontology.IdElement.Element.Code).Append("] in ").Append(ids.ToString());// TODO:参数化EntityIDs
            var list = new List<object[]>();
            var reader = this.GetEntityDb(ontology).ExecuteReader(sqlQuery.ToString());
            while (reader.Read())
            {
                var values = new object[selectElements.Count];
                for (int i = 0; i < selectElements.Count; i++)
                {
                    values[i] = reader.GetValue(i);
                }
                list.Add(values);
            }
            reader.Close();

            return new DataTuple(selectElements, list.ToArray());
        }
コード例 #44
0
ファイル: MessageProvider.cs プロジェクト: mingkongbin/anycmd
        /// <summary>
        /// 根据节点分页获取命令
        /// </summary>
        /// <typeparam name="T">命令类型参数</typeparam>
        /// <param name="commandType"></param>
        /// <param name="ontology">本体</param>
        /// <param name="catalogCode">目录码</param>
        /// <param name="actionCode">动作码,空值表示忽略本查询条件</param>
        /// <param name="nodeId">节点标识,空值表示忽略本查询条件</param>
        /// <param name="localEntityId">本地实体标识</param>
        /// <param name="pageIndex">页索引</param>
        /// <param name="pageSize">页尺寸</param>
        /// <param name="sortField">排序字段</param>
        /// <param name="sortOrder">排序方向</param>
        /// <param name="total">总记录数</param>
        /// <returns></returns>
        public IList<MessageEntity> GetPlistCommands(MessageTypeKind commandType,
            OntologyDescriptor ontology, string catalogCode, string actionCode, Guid? nodeId, string localEntityId,
            int pageIndex, int pageSize, string sortField, string sortOrder, out Int64 total)
        {
            var tableName = GetTableName(commandType);
            var queryString =
            @"select top " + pageSize.ToString(CultureInfo.InvariantCulture) + " * from (SELECT ROW_NUMBER() OVER(ORDER BY " + sortField + " " + sortOrder + ") AS RowNumber,* from " + tableName +
            @" as a where a.Ontology=@Ontology {0}) b
             where b.RowNumber>" + (pageSize * pageIndex).ToString(CultureInfo.InvariantCulture);
            var countQs =
            @"select count(Id) from " + tableName + @" as a
            where a.Ontology=@Ontology {0}";
            if (!string.IsNullOrEmpty(actionCode))
            {
                queryString = string.Format(queryString, " and a.Verb=@Verb {0}");
                countQs = string.Format(countQs, " and a.Verb=@Verb {0}");
            }
            if (!string.IsNullOrEmpty(localEntityId))
            {
                queryString = string.Format(queryString, " and a.LocalEntityID=@LocalEntityId {0}");
                countQs = string.Format(countQs, " and a.LocalEntityID=@LocalEntityId {0}");
            }
            if (!string.IsNullOrEmpty(catalogCode))
            {
                queryString = string.Format(queryString, " and a.CatalogCode like @CatalogCode {0}");
                countQs = string.Format(countQs, " and a.CatalogCode like @CatalogCode {0}");
            }
            if (nodeId.HasValue)
            {
                queryString = string.Format(queryString, " and a.ClientID=@ClientId");
                countQs = string.Format(countQs, " and a.ClientID=@ClientId");
            }
            else
            {
                queryString = string.Format(queryString, "");
                countQs = string.Format(countQs, "");
            }
            var db = this.GetCommandDb(ontology);
            var parms = new List<DbParameter> { CreateParameter(db, "Ontology", ontology.Ontology.Code, DbType.String) };
            if (!string.IsNullOrEmpty(actionCode))
            {
                parms.Add(CreateParameter(db, "Verb", actionCode, DbType.String));
            }
            if (nodeId.HasValue)
            {
                parms.Add(CreateParameter(db, "ClientId", nodeId.Value, DbType.Guid));
            }
            if (!string.IsNullOrEmpty(localEntityId))
            {
                parms.Add(CreateParameter(db, "LocalEntityId", localEntityId, DbType.String));
            }
            if (!string.IsNullOrEmpty(catalogCode))
            {
                parms.Add(CreateParameter(db, "CatalogCode", catalogCode + "%", DbType.String));
            }

            var pArray = parms.ToArray();
            IList<MessageEntity> list = new List<MessageEntity>();
            using (var reader = this.GetCommandDb(ontology).ExecuteReader(queryString, pArray))
            {
                while (reader.Read())
                {
                    list.Add(CommandRecord.Create(ontology.Host, commandType, reader));
                }
            }
            total = (int)this.GetCommandDb(ontology).ExecuteScalar(countQs, parms.Select(p => ((ICloneable)p).Clone()).Cast<DbParameter>().ToArray());

            return list;
        }
コード例 #45
0
ファイル: EntityProvider.cs プロジェクト: mingkongbin/anycmd
 /// <summary>
 /// 
 /// </summary>
 /// <param name="ontology"></param>
 /// <param name="archive"></param>
 public void Archive(OntologyDescriptor ontology, IArchive archive)
 {
     var entityDb = this.GetEntityDb(ontology).Database;
     var archiveDb = this.GetArchiveDb(ontology, archive);
     if (archiveDb.Database.CatalogName.Equals(entityDb.CatalogName, StringComparison.OrdinalIgnoreCase))
     {
         throw new AnycmdException("归档库的数据库名不能与本体库相同");
     }
     // 创建归档库
     archiveDb.Create(this.GetEntityDb(ontology), ontology.Host.Config.EntityArchivePath);
     string archiveTableName = string.Format(
         "{0}.{1}.{2}", archiveDb.Database.CatalogName, ontology.Ontology.EntitySchemaName, ontology.Ontology.EntityTableName);
     string sql =
     @"if OBJECT_ID('" + archiveTableName + "') IS NULL select * into " + archiveTableName
     + " from " + ontology.Ontology.EntityTableName;
     // 执行select into归档数据
     this.GetEntityDb(ontology).ExecuteNonQuery(sql, null);
 }
コード例 #46
0
ファイル: MessageProvider.cs プロジェクト: mingkongbin/anycmd
        public MessageEntity GetCommand(MessageTypeKind commandType, OntologyDescriptor ontology, Guid id)
        {
            var db = this.GetCommandDb(ontology);
            var queryString =
            @"select * from " + GetTableName(commandType) + " as a where a.Id=@Id";
            using (var reader = db.ExecuteReader(queryString, CreateParameter(db, "Id", id, DbType.Guid)))
            {
                if (reader.Read())
                {
                    return CommandRecord.Create(ontology.Host, commandType, reader);
                }
            }

            return null;
        }
コード例 #47
0
        /// <summary>
        /// 根据节点分页获取命令
        /// </summary>
        /// <typeparam name="T">命令类型参数</typeparam>
        /// <param name="commandType"></param>
        /// <param name="ontology">本体</param>
        /// <param name="catalogCode">目录码</param>
        /// <param name="actionCode">动作码,空值表示忽略本查询条件</param>
        /// <param name="nodeId">节点标识,空值表示忽略本查询条件</param>
        /// <param name="localEntityId">本地实体标识</param>
        /// <param name="pageIndex">页索引</param>
        /// <param name="pageSize">页尺寸</param>
        /// <param name="sortField">排序字段</param>
        /// <param name="sortOrder">排序方向</param>
        /// <param name="total">总记录数</param>
        /// <returns></returns>
        public IList <MessageEntity> GetPlistCommands(MessageTypeKind commandType,
                                                      OntologyDescriptor ontology, string catalogCode, string actionCode, Guid?nodeId, string localEntityId,
                                                      int pageIndex, int pageSize, string sortField, string sortOrder, out Int64 total)
        {
            var tableName   = GetTableName(commandType);
            var queryString =
                @"select top " + pageSize.ToString(CultureInfo.InvariantCulture) + " * from (SELECT ROW_NUMBER() OVER(ORDER BY " + sortField + " " + sortOrder + ") AS RowNumber,* from " + tableName +
                @" as a where a.Ontology=@Ontology {0}) b 
 where b.RowNumber>" + (pageSize * pageIndex).ToString(CultureInfo.InvariantCulture);
            var countQs =
                @"select count(Id) from " + tableName + @" as a 
where a.Ontology=@Ontology {0}";

            if (!string.IsNullOrEmpty(actionCode))
            {
                queryString = string.Format(queryString, " and a.Verb=@Verb {0}");
                countQs     = string.Format(countQs, " and a.Verb=@Verb {0}");
            }
            if (!string.IsNullOrEmpty(localEntityId))
            {
                queryString = string.Format(queryString, " and a.LocalEntityID=@LocalEntityId {0}");
                countQs     = string.Format(countQs, " and a.LocalEntityID=@LocalEntityId {0}");
            }
            if (!string.IsNullOrEmpty(catalogCode))
            {
                queryString = string.Format(queryString, " and a.CatalogCode like @CatalogCode {0}");
                countQs     = string.Format(countQs, " and a.CatalogCode like @CatalogCode {0}");
            }
            if (nodeId.HasValue)
            {
                queryString = string.Format(queryString, " and a.ClientID=@ClientId");
                countQs     = string.Format(countQs, " and a.ClientID=@ClientId");
            }
            else
            {
                queryString = string.Format(queryString, "");
                countQs     = string.Format(countQs, "");
            }
            var db    = this.GetCommandDb(ontology);
            var parms = new List <DbParameter> {
                CreateParameter(db, "Ontology", ontology.Ontology.Code, DbType.String)
            };

            if (!string.IsNullOrEmpty(actionCode))
            {
                parms.Add(CreateParameter(db, "Verb", actionCode, DbType.String));
            }
            if (nodeId.HasValue)
            {
                parms.Add(CreateParameter(db, "ClientId", nodeId.Value, DbType.Guid));
            }
            if (!string.IsNullOrEmpty(localEntityId))
            {
                parms.Add(CreateParameter(db, "LocalEntityId", localEntityId, DbType.String));
            }
            if (!string.IsNullOrEmpty(catalogCode))
            {
                parms.Add(CreateParameter(db, "CatalogCode", catalogCode + "%", DbType.String));
            }

            var pArray = parms.ToArray();
            IList <MessageEntity> list = new List <MessageEntity>();

            using (var reader = this.GetCommandDb(ontology).ExecuteReader(queryString, pArray))
            {
                while (reader.Read())
                {
                    list.Add(CommandRecord.Create(ontology.Host, commandType, reader));
                }
            }
            total = (int)this.GetCommandDb(ontology).ExecuteScalar(countQs, parms.Select(p => ((ICloneable)p).Clone()).Cast <DbParameter>().ToArray());

            return(list);
        }
コード例 #48
0
        /// <summary>
        /// 根据目录获取给定节点和本体的数据,如果传入的目录为空表示获取本节点的数据
        /// <remarks>本节点通常是中心节点</remarks>
        /// </summary>
        /// <param name="ontology"></param>
        /// <param name="db">模型</param>
        /// <param name="filters"></param>
        /// <param name="selectElements">sql select语句的选择列集合</param>
        /// <param name="pagingData"></param>
        /// <returns>
        /// 数据记录列表,数据记录表现为字典形式,键是数据元素编码值是相应数据元素对应的数据项值
        /// </returns>
        private DataTuple GetPlistInfoItems(
            OntologyDescriptor ontology,
            RdbDescriptor db, OrderedElementSet selectElements, List <FilterData> filters,
            PagingInput pagingData)
        {
            if (string.IsNullOrEmpty(pagingData.SortField))
            {
                pagingData.SortField = "IncrementId";
            }
            if (string.IsNullOrEmpty(pagingData.SortOrder))
            {
                pagingData.SortOrder = "asc";
            }

            var elements = ontology.Elements;

            if (filters != null)
            {
                for (int i = 0; i < filters.Count; i++)
                {
                    var filter = filters[i];
                    if (elements.ContainsKey(filter.field))
                    {
                        // TODO:根据数据属性优化查询,比如对于身份证件号来说如果输入的值长度
                        // 为20或18的话可以将like替换为等于
                        filter.type = "string";
                        var element = elements[filter.field];
                        if (element.Element.IsEnabled != 1)
                        {
                            continue;
                        }
                        if (element.Element.InfoDicId.HasValue)
                        {
                            filter.comparison = "eq";
                        }
                        else
                        {
                            filter.comparison = "like";
                        }
                    }
                    else
                    {
                        filters.RemoveAt(i);
                    }
                }
            }

            var tableName      = ontology.Ontology.EntityTableName;
            var sbSqlPredicate = new StringBuilder();
            var l = sbSqlPredicate.Length;

            var pQueryList = new List <DbParameter>();
            List <DbParameter> pFilters;
            var filterString = _filterStringBuilder.FilterString(db, filters, null, out pFilters);

            if (!string.IsNullOrEmpty(filterString))
            {
                foreach (var pFilter in pFilters)
                {
                    object obj = pFilter.Value;
                    if (obj == null)
                    {
                        obj = DBNull.Value;
                    }
                    var p = db.CreateParameter();
                    p.ParameterName = pFilter.ParameterName;
                    p.Value         = obj;
                    pQueryList.Add(p);
                }
                if (sbSqlPredicate.Length != l)
                {
                    sbSqlPredicate.Append(" and ");
                }
                sbSqlPredicate.Append(filterString);
            }

            string sqlPredicateString = string.Empty;

            if (sbSqlPredicate.Length > 0)
            {
                sqlPredicateString = sbSqlPredicate.ToString();
            }
            var sqlText = new StringBuilder();
            OrderedElementSet elementList;

            if (selectElements == null || selectElements.Count == 0)
            {
                elementList = new OrderedElementSet {
                    ontology.Elements["id"]
                };
            }
            else
            {
                elementList = selectElements;
            }
            sqlText.Append("SELECT TOP {0} ");
            int len = sqlText.Length;

            foreach (var element in elementList)
            {
                if (sqlText.Length != len)
                {
                    sqlText.Append(",");
                }
                sqlText.Append("[").Append(element.Element.FieldCode).Append("]");
            }

            sqlText.Append(" FROM (SELECT ROW_NUMBER() OVER(ORDER BY {1} {2}) AS RowNumber,");
            len = sqlText.Length;

            foreach (var element in elementList)
            {
                if (sqlText.Length != len)
                {
                    sqlText.Append(",");
                }
                sqlText.Append("[").Append(element.Element.FieldCode).Append("]");
            }

            sqlText.Append(" FROM {3} where ");
            if (ontology.Ontology.IsLogicalDeletionEntity)
            {
                sqlText.Append("DeletionStateCode = 0");
            }
            else
            {
                sqlText.Append("1 = 1");
            }
            if (!string.IsNullOrEmpty(sqlPredicateString))
            {
                sqlText.Append(" and ").Append(sqlPredicateString);
            }
            sqlText.Append(") a WHERE a.RowNumber > {4}");
            string sqlQuery = string.Format(
                sqlText.ToString(),
                pagingData.PageSize.ToString(CultureInfo.InvariantCulture),
                pagingData.SortField,
                pagingData.SortOrder,
                tableName,
                (pagingData.SkipCount).ToString(CultureInfo.InvariantCulture));

            pagingData.Count(() =>
            {
                string where    = ontology.Ontology.IsLogicalDeletionEntity ? "where DeletionStateCode = 0" : "";
                string sqlCount = string.Format("select count(1) from {0} {1}", tableName, where);
                if (!string.IsNullOrEmpty(sqlPredicateString))
                {
                    sqlCount = sqlCount + " and " + sqlPredicateString;
                }
                return((int)db.ExecuteScalar(
                           sqlCount, pQueryList.Select(p => ((ICloneable)p).Clone()).Cast <DbParameter>().ToArray()));
            });

            var list   = new List <object[]>();
            var reader = db.ExecuteReader(sqlQuery, pQueryList.ToArray());

            while (reader.Read())
            {
                var values = new object[elementList.Count];
                for (int i = 0; i < elementList.Count; i++)
                {
                    values[i] = reader.GetValue(i);
                }
                list.Add(values);
            }
            reader.Close();

            return(new DataTuple(elementList, list.ToArray()));
        }
コード例 #49
0
ファイル: MessageProvider.cs プロジェクト: mingkongbin/anycmd
        /// <summary>
        /// 批量保存本地事件
        /// </summary>
        /// <param name="ontology">本体</param>
        /// <param name="commands"></param>
        public ProcessResult SaveCommands(OntologyDescriptor ontology, MessageEntity[] commands)
        {
            if (ontology == null)
            {
                return new ProcessResult(new ArgumentNullException("ontology", @"ontology参数为null"));
            }
            if (commands == null)
            {
                return new ProcessResult(new ArgumentNullException("commands"));
            }
            foreach (var command in commands)
            {
                if (command == null)
                {
                    return new ProcessResult(new ArgumentNullException("command", "命令数组中有null"));
                }
                else if (!ontology.Ontology.Code.Equals(command.Ontology, StringComparison.OrdinalIgnoreCase))
                {
                    return new ProcessResult(new ArgumentNullException("command.Ontology", "同一命令数组中的命令必须在相同本体下"));
                }
            }
            ProcessResult r = ProcessResult.Ok;
            // 存放异常信息
            StringBuilder sb = new StringBuilder();
            int l = sb.Length;
            // 按照命令类型分组,不同类型的命令可能存储在不同的数据库表
            var gs = commands.GroupBy(c => c.CommandType);
            foreach (var g in gs)
            {
                // 本组命令类型所对应的数据库表
                string tableId = string.Format("[{0}][{1}]", ontology.Ontology.MessageSchemaName, GetTableName(g.Key));
                DbTable dbTable;
                if (!this.GetCommandDb(ontology).TryGetDbTable(tableId, out dbTable))
                {
                    r = new ProcessResult(new AnycmdException("意外的数据库表标识" + tableId));
                }
                // 当前命令表模式克隆得到的新表
                var dt = this.GetCommandDb(ontology).NewTable(dbTable);
                foreach (var command in g)
                {
                    if (command.CommandType == MessageTypeKind.Invalid || command.CommandType == MessageTypeKind.AnyCommand)
                    {
                        r = new ProcessResult(false, Status.InvalidArgument, "Invalid和AnyCommand类型命令不能持久化");
                    }
                    else if (string.IsNullOrEmpty(command.Verb.Code))
                    {
                        r = new ProcessResult(false, Status.InvalidArgument, "Verb为空或null不能持久化");
                    }
                    else if (string.IsNullOrEmpty(command.MessageId)
                        || command.MessageId.Length > 50)
                    {
                        r = new ProcessResult(false, Status.InvalidArgument, "MessageID为空或null或者长度大于50字符不能持久化");
                    }
                    else if (string.IsNullOrEmpty(command.LocalEntityId))
                    {
                        r = new ProcessResult(false, Status.InvalidArgument, "LocalEntityID为空或null不能持久化");
                    }
                    else if (command.DataTuple.IdItems.IsEmpty)
                    {
                        r = new ProcessResult(false, Status.InvalidArgument, "当前命令的信息标识为空则不能持久化");
                    }
                    else if (!command.TimeStamp.IsValid())
                    {
                        r = new ProcessResult(false, Status.InvalidArgument, "TimeStamp非法则不能持久化");
                    }
                    else if (string.IsNullOrEmpty(command.Ontology))
                    {
                        r = new ProcessResult(false, Status.InvalidArgument, "Ontology为空或null不能持久化");
                    }
                    else if (string.IsNullOrEmpty(command.ClientId))
                    {
                        r = new ProcessResult(false, Status.InvalidArgument, "ClientID为空或null不能持久化");
                    }
                    if (r.IsSuccess)
                    {
                        // 将当前命令转化DataRow,一个命令对应一行
                        var row = command.ToDataRow(dt);
                        int ll = sb.Length;
                        // 检测每一列对应的值是否超出了数据库定义的长度
                        for (int i = 0; i < dt.Columns.Count; i++)
                        {
                            var dbCol = dt.Columns[i];
                            if (dbCol.MaxLength != -1)
                            {
                                if (row[i].ToString().Length > dbCol.MaxLength)
                                {
                                    if (sb.Length != ll)
                                    {
                                        sb.Append(";");
                                    }
                                    sb.Append(tableId).Append("表:");
                                    sb.Append(dbCol.ColumnName + "超过最大长度,最长" + dbCol.MaxLength.ToString());
                                }
                            }
                        }
                        if (sb.Length == ll)
                        {
                            // 如果不是哑命令。哑命令是不能爆炸的。
                            if (!command.IsDumb)
                            {
                                dt.Rows.Add(row);
                            }
                        }
                    }
                    else
                    {
                        sb.Append(r.Description);
                    }
                }

                this.GetCommandDb(ontology).WriteToServer(dt);
            }

            if (sb.Length != l)
            {
                r = new ProcessResult(new AnycmdException(sb.ToString()));
            }
            else
            {
                r = ProcessResult.Ok;
            }

            if (r.Exception != null)
            {
                ontology.Host.LoggingService.Error(r.Exception);
            }

            return r;
        }
コード例 #50
0
ファイル: MessageProvider.cs プロジェクト: mingkongbin/anycmd
 /// <summary>
 /// 
 /// </summary>
 private RdbDescriptor GetCommandDb(OntologyDescriptor ontology)
 {
     if (!_dbDic.ContainsKey(ontology))
     {
         lock (_locker)
         {
             if (!_dbDic.ContainsKey(ontology))
             {
                 RdbDescriptor db;
                 if (!ontology.Host.Rdbs.TryDb(ontology.Ontology.MessageDatabaseId, out db))
                 {
                     throw new AnycmdException("意外的数据库Id" + ontology.Ontology.MessageDatabaseId.ToString());
                 }
                 _dbDic.Add(ontology, db);
             }
         }
     }
     return _dbDic[ontology];
 }
コード例 #51
0
ファイル: EntityProvider.cs プロジェクト: mingkongbin/anycmd
        public TowInfoTuple GetTopTwo(
			OntologyDescriptor ontology, IEnumerable<InfoItem> infoIDs, OrderedElementSet selectElements)
        {
            return GetTop2InfoItemSet(ontology, this.GetEntityDb(ontology), infoIDs, selectElements);
        }
コード例 #52
0
        /// <summary>
        /// 批量保存本地事件
        /// </summary>
        /// <param name="ontology">本体</param>
        /// <param name="commands"></param>
        public ProcessResult SaveCommands(OntologyDescriptor ontology, MessageEntity[] commands)
        {
            if (ontology == null)
            {
                return(new ProcessResult(new ArgumentNullException("ontology", @"ontology参数为null")));
            }
            if (commands == null)
            {
                return(new ProcessResult(new ArgumentNullException("commands")));
            }
            foreach (var command in commands)
            {
                if (command == null)
                {
                    return(new ProcessResult(new ArgumentNullException("command", "命令数组中有null")));
                }
                else if (!ontology.Ontology.Code.Equals(command.Ontology, StringComparison.OrdinalIgnoreCase))
                {
                    return(new ProcessResult(new ArgumentNullException("command.Ontology", "同一命令数组中的命令必须在相同本体下")));
                }
            }
            ProcessResult r = ProcessResult.Ok;
            // 存放异常信息
            StringBuilder sb = new StringBuilder();
            int           l  = sb.Length;
            // 按照命令类型分组,不同类型的命令可能存储在不同的数据库表
            var gs = commands.GroupBy(c => c.CommandType);

            foreach (var g in gs)
            {
                // 本组命令类型所对应的数据库表
                string  tableId = string.Format("[{0}][{1}]", ontology.Ontology.MessageSchemaName, GetTableName(g.Key));
                DbTable dbTable;
                if (!this.GetCommandDb(ontology).TryGetDbTable(tableId, out dbTable))
                {
                    r = new ProcessResult(new GeneralException("意外的数据库表标识" + tableId));
                }
                // 当前命令表模式克隆得到的新表
                var dt = this.GetCommandDb(ontology).NewTable(dbTable);
                foreach (var command in g)
                {
                    if (command.CommandType == MessageTypeKind.Invalid || command.CommandType == MessageTypeKind.AnyCommand)
                    {
                        r = new ProcessResult(false, Status.InvalidArgument, "Invalid和AnyCommand类型命令不能持久化");
                    }
                    else if (string.IsNullOrEmpty(command.Verb.Code))
                    {
                        r = new ProcessResult(false, Status.InvalidArgument, "Verb为空或null不能持久化");
                    }
                    else if (string.IsNullOrEmpty(command.MessageId) ||
                             command.MessageId.Length > 50)
                    {
                        r = new ProcessResult(false, Status.InvalidArgument, "MessageID为空或null或者长度大于50字符不能持久化");
                    }
                    else if (string.IsNullOrEmpty(command.LocalEntityId))
                    {
                        r = new ProcessResult(false, Status.InvalidArgument, "LocalEntityID为空或null不能持久化");
                    }
                    else if (command.DataTuple.IdItems.IsEmpty)
                    {
                        r = new ProcessResult(false, Status.InvalidArgument, "当前命令的信息标识为空则不能持久化");
                    }
                    else if (!command.TimeStamp.IsValid())
                    {
                        r = new ProcessResult(false, Status.InvalidArgument, "TimeStamp非法则不能持久化");
                    }
                    else if (string.IsNullOrEmpty(command.Ontology))
                    {
                        r = new ProcessResult(false, Status.InvalidArgument, "Ontology为空或null不能持久化");
                    }
                    else if (string.IsNullOrEmpty(command.ClientId))
                    {
                        r = new ProcessResult(false, Status.InvalidArgument, "ClientID为空或null不能持久化");
                    }
                    if (r.IsSuccess)
                    {
                        // 将当前命令转化DataRow,一个命令对应一行
                        var row = command.ToDataRow(dt);
                        int ll  = sb.Length;
                        // 检测每一列对应的值是否超出了数据库定义的长度
                        for (int i = 0; i < dt.Columns.Count; i++)
                        {
                            var dbCol = dt.Columns[i];
                            if (dbCol.MaxLength != -1)
                            {
                                if (row[i].ToString().Length > dbCol.MaxLength)
                                {
                                    if (sb.Length != ll)
                                    {
                                        sb.Append(";");
                                    }
                                    sb.Append(tableId).Append("表:");
                                    sb.Append(dbCol.ColumnName + "超过最大长度,最长" + dbCol.MaxLength.ToString());
                                }
                            }
                        }
                        if (sb.Length == ll)
                        {
                            // 如果不是哑命令。哑命令是不能爆炸的。
                            if (!command.IsDumb)
                            {
                                dt.Rows.Add(row);
                            }
                        }
                    }
                    else
                    {
                        sb.Append(r.Description);
                    }
                }

                this.GetCommandDb(ontology).WriteToServer(dt);
            }

            if (sb.Length != l)
            {
                r = new ProcessResult(new GeneralException(sb.ToString()));
            }
            else
            {
                r = ProcessResult.Ok;
            }

            if (r.Exception != null)
            {
                ontology.Host.LoggingService.Error(r.Exception);
            }

            return(r);
        }
コード例 #53
0
 /// <summary>
 /// 根据Id查询命令详细信息
 /// </summary>
 /// <typeparam name="T">命令详细信息展示模型类型参数</typeparam>
 /// <param name="messageProvider">命令提供程序</param>
 /// <param name="messageTypeKind"></param>
 /// <param name="ontology">本体</param>
 /// <param name="id">命令标识</param>
 /// <returns></returns>
 public static MessageTr GetCommandInfo(
     this IMessageProvider messageProvider, MessageTypeKind messageTypeKind, OntologyDescriptor ontology, Guid id)
 {
     var command = messageProvider.GetCommand(messageTypeKind, ontology, id);
     return MessageTr.Create(ontology.Host, command);
 }