示例#1
0
        /// <summary>
        /// 快速删除数据,内部根据实体类的主键进行删除
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="list"></param>
        public void QuickDelete <T>(List <T> list) where T : EntityBase, new()
        {
            List <object> idList    = new List <object>();
            T             entity0   = list[0];
            string        tableName = entity0.GetTableName();
            string        pkName    = entity0.PrimaryKeys[0];


            foreach (T entity in list)
            {
                idList.Add(entity[pkName]);
            }

            List <DeletedPKIDEntity> dteList = new List <DeletedPKIDEntity>();

            foreach (T entity in list)
            {
                object            pkValue  = entity[pkName];
                DeletedPKIDEntity idEntity = new DeletedPKIDEntity();
                if (pkValue is string)
                {
                    idEntity.TargetID       = 0;
                    idEntity.TargetStringID = pkValue.ToString();
                }
                else
                {
                    idEntity.TargetID       = Convert.ToInt64(pkValue);
                    idEntity.TargetStringID = "";
                }

                idEntity.TargetTableName = tableName;
                idEntity.DeletedTime     = DateTime.Now;

                dteList.Add(idEntity);
            }

            OQL deleteQ = OQL.From(entity0)
                          .Delete()
                          .Where(cmp => cmp.Comparer(entity0[pkName], OQLCompare.CompareType.IN, idList.ToArray()))
                          .END;

            AdoHelper db = this.OptDbContext.CurrentDataBase;
            EntityQuery <DeletedPKIDEntity> eq = new EntityQuery <DeletedPKIDEntity>(db);

            db.BeginTransaction();
            try
            {
                int delCount = eq.ExecuteOql(deleteQ);
                int insCount = eq.QuickInsert(dteList);
                if (delCount != insCount)
                {
                    throw new Exception("插入和删除的数据记录数不一样,删除数:" + delCount + ",插入数:" + insCount);
                }
                db.Commit();
            }
            catch (Exception ex)
            {
                db.Rollback();
            }
        }
示例#2
0
        private void Exporter_OnExported <T>(object sender, ExportEntityEventArgs <T> e) where T : EntityBase, new()
        {
            Console.WriteLine("------------------------------------------------------------");
            if (e.Succeed)
            {
                //处理上次没有导入的剩余数据============================
                //尝试加载本地数据,与导出的数据合并,以本次导出的数据优先
                List <T> lastData = this.MemDB.LoadEntity <T>();
                if (lastData != null && lastData.Count > 0)
                {
                    string pkName = lastData[0].PrimaryKeys[0];
                    if (e.ExportedDataList.Count > 0)
                    {
                        object[] ids    = e.ExportedDataList.Select(p => p[pkName]).ToArray();
                        var      except = lastData.Where(p => !ids.Contains(p[pkName])).ToList();
                        e.ExportedDataList.AddRange(except);
                    }
                    else
                    {
                        e.ExportedDataList.AddRange(lastData);
                    }
                }

                if (e.ExportedDataList.Count > 0)
                {
                    if (e.EntityType == typeof(DeletedPKIDEntity))
                    {
                        //ID记录表,导出后删除当前批次数据库记录
                        DeletedPKIDEntity entity = new DeletedPKIDEntity();
                        OQL q = OQL.From(entity)
                                .Delete()
                                .Where(cmp => cmp.Comparer(entity.BatchNumber, "=", e.BatchNumber))
                                .END;
                        int count = EntityQuery <DeletedPKIDEntity> .ExecuteOql(q, CurrDbContext.CurrentDataBase);

                        Console.WriteLine("当前导出批次{0} 已经清除当前的ID删除表信息记录,条数:{1}", e.BatchNumber, count);
                    }
                    else
                    {
                        //已经提前更新了导出批次号,参见 FilterQuery 方法
                    }

                    this.HaveDataTableCount++;
                }
                Console.WriteLine("导出数据成功!\t 导出批次号:{0}\t 导出表名称:{1}\t 导出记录数:{2}",
                                  e.BatchNumber,
                                  e.ExportTable,
                                  e.ExportedDataList.Count);
            }
            else
            {
                Console.WriteLine("导出数据失败,\r\n 导出批次号:{0}\r\n 导出表名称:{1}\r\n 出错原因:{2}",
                                  e.BatchNumber,
                                  e.ExportTable,
                                  e.OperationExcepiton.Message);
                this.AllSucceed = false;
            }
        }