示例#1
0
        private IDataReader GetReader <T>()
        {
            string sql = string.Empty;

            try
            {
                if (Capacity < 0 || _filter == null || _schema == null)
                {
                    TraceLog.WriteError("The {0} schema config is empty.", typeof(T).FullName);
                    return(null);
                }
                string tableName = _schema.GetTableName();
                if (string.IsNullOrEmpty(tableName))
                {
                    TraceLog.WriteError("The {0} schema table name is empty.", _schema.EntityType.FullName);
                    return(null);
                }

                DbBaseProvider dbprovider = DbConnectionProvider.CreateDbProvider(_schema);
                if (dbprovider == null)
                {
                    TraceLog.WriteError("The {0} ConnectKey:{1} is empty.", _schema.EntityType.FullName, _schema.ConnectKey);
                    return(null);
                }
                var command = dbprovider.CreateCommandStruct(tableName, CommandMode.Inquiry);
                var columns = _schema.GetColumnNames();
                command.Columns = string.Join(",", columns);
                command.OrderBy = (string.IsNullOrEmpty(_filter.OrderColumn) ? _schema.OrderColumn : _filter.OrderColumn) ?? "";
                if (Capacity < int.MaxValue && Capacity > 0)
                {
                    command.Top = Capacity;
                    if (string.IsNullOrEmpty(command.OrderBy))
                    {
                        string orderStr = "";
                        foreach (var key in _schema.Keys)
                        {
                            if (orderStr.Length > 0)
                            {
                                orderStr += ",";
                            }
                            orderStr += string.Format("{0}", dbprovider.FormatName(key));
                        }
                        command.OrderBy = orderStr;
                    }
                }
                command.Filter = dbprovider.CreateCommandFilter();

                command.Filter.Condition = MergerCondition(_filter.Condition, _schema.Condition);
                ParseDataParameter(command.Filter);

                command.Parser();
                sql = command.Sql;
                return(dbprovider.ExecuteReader(CommandType.Text, command.Sql, command.Parameters));
            }
            catch (Exception ex)
            {
                TraceLog.WriteError("DB execute reader sql:\"{0}\" error:{1}", sql, ex);
            }
            return(null);
        }
示例#2
0
        private IList <string> GetPostColumns(ISqlEntity data, SchemaTable schemaTable, bool isChange)
        {
            List <string> columns = null;

            if (data is AbstractEntity)
            {
                var entity = data as AbstractEntity;
                //修正not change column
                if (!entity.IsNew && !entity.IsDelete &&
                    entity.HasChangePropertys && isChange &&
                    schemaTable.Columns.Keys.Count > schemaTable.Keys.Length)
                {
                    columns = entity.DequeueChangePropertys().ToList();
                }
                else
                {
                    if (entity.HasChangePropertys)
                    {
                        entity.ResetChangePropertys();
                    }
                    columns = schemaTable.GetColumnNames();
                }
            }
            return(columns);
        }
示例#3
0
        private void SetEntityValue(SchemaTable schemaTable, IDataReader reader, AbstractEntity entity)
        {
            var columns = schemaTable.GetColumnNames();

            foreach (var columnName in columns)
            {
                SchemaColumn fieldAttr;
                if (!schemaTable.Columns.TryGetValue(columnName, out fieldAttr))
                {
                    continue;
                }
                object fieldValue = null;
                if (fieldAttr.IsSerialized)
                {
                    var value = reader[columnName];
                    //指定序列化方式
                    if (fieldAttr.DbType == ColumnDbType.LongBlob || fieldAttr.DbType == ColumnDbType.Blob)
                    {
                        fieldValue = DeserializeBinaryObject(schemaTable, entity, value, fieldAttr, columnName);
                    }
                    else
                    {
                        fieldValue = DeserializeJsonObject(schemaTable, entity, value, fieldAttr, columnName);
                    }
                    if (fieldValue is EntityChangeEvent)
                    {
                        ((EntityChangeEvent)fieldValue).PropertyName = columnName;
                    }
                }
                else
                {
                    try
                    {
                        fieldValue = entity.ParseValueType(reader[columnName], fieldAttr.ColumnType);
                    }
                    catch (Exception ex)
                    {
                        TraceLog.WriteError("Table:{0} column:{1} parse value error:\r\n{0}", schemaTable.EntityName, columnName, ex);
                    }
                }
                if (fieldAttr.CanWrite)
                {
                    entity.SetPropertyValue(columnName, fieldValue);
                }
                else
                {
                    entity.SetFieldValue(columnName, fieldValue);
                }
            }
        }
示例#4
0
        private void SetEntityValue(SchemaTable schemaTable, IDataReader reader, AbstractEntity entity)
        {
            var columns = schemaTable.GetColumnNames();

            foreach (var columnName in columns)
            {
                SchemaColumn fieldAttr;
                if (!schemaTable.Columns.TryGetValue(columnName, out fieldAttr))
                {
                    continue;
                }
                object fieldValue = null;
                if (fieldAttr.IsJson)
                {
                    var value = reader[columnName];
                    if (fieldAttr.ColumnType.IsSubclassOf(typeof(Array)))
                    {
                        value = value.ToString().StartsWith("[") ? value : "[" + value + "]";
                    }
                    try
                    {
                        string tempValue = value.ToNotNullString();
                        if (!string.IsNullOrEmpty(fieldAttr.JsonDateTimeFormat) &&
                            tempValue.IndexOf(@"\/Date(") == -1)
                        {
                            fieldValue = JsonUtils.DeserializeCustom(tempValue, fieldAttr.ColumnType, fieldAttr.JsonDateTimeFormat);
                        }
                        else
                        {
                            fieldValue = JsonUtils.Deserialize(tempValue, fieldAttr.ColumnType);
                        }
                    }
                    catch (Exception ex)
                    {
                        TraceLog.WriteError("Table:{0} key:{1} column:{2} deserialize json error:{3} to {4}\r\nException:{5}",
                                            schemaTable.Name,
                                            entity.GetKeyCode(),
                                            columnName,
                                            fieldValue,
                                            fieldAttr.ColumnType.FullName,
                                            ex);
                    }
                    if (fieldValue is EntityChangeEvent)
                    {
                        ((EntityChangeEvent)fieldValue).PropertyName = columnName;
                    }
                }
                else
                {
                    try
                    {
                        fieldValue = entity.ParseValueType(reader[columnName], fieldAttr.ColumnType);
                    }
                    catch (Exception ex)
                    {
                        TraceLog.WriteError("Table:{0} column:{1} parse value error:\r\n{0}", schemaTable.Name, columnName, ex);
                    }
                }
                if (fieldAttr.CanWrite)
                {
                    entity.SetPropertyValue(columnName, fieldValue);
                }
                else
                {
                    entity.SetFieldValue(columnName, fieldValue);
                }
            }
        }
示例#5
0
        private CommandStruct GenerateCommand <T>(DbBaseProvider dbProvider, T data, SchemaTable schemaTable, EntityPropertyGetFunc <T> getFunc, EnttiyPostColumnFunc <T> postColumnFunc) where T : ISqlEntity
        {
            CommandStruct command;

            if (!(schemaTable.StorageType.HasFlag(StorageType.ReadOnlyDB) ||
                  schemaTable.StorageType.HasFlag(StorageType.ReadWriteDB) ||
                  schemaTable.StorageType.HasFlag(StorageType.WriteOnlyDB)) ||
                (string.IsNullOrEmpty(schemaTable.ConnectKey) &&
                 string.IsNullOrEmpty(schemaTable.ConnectionString)))
            {
                return(null);
            }
            if (getFunc == null)
            {
                getFunc = GetPropertyValue;
            }

            IList <string> columns = postColumnFunc != null
                ? postColumnFunc(data, schemaTable, _isChange)
                : schemaTable.GetColumnNames();

            if (columns == null || columns.Count == 0)
            {
                TraceLog.WriteError("Class:{0} is not change column.", data.GetType().FullName);
                return(null);
            }
            string tableName = schemaTable.GetTableName(data.GetCreateTime());

            if (data.IsDelete)
            {
                command = dbProvider.CreateCommandStruct(tableName, CommandMode.Delete);
            }
            else if (schemaTable.AccessLevel == AccessLevel.WriteOnly)
            {
                command = dbProvider.CreateCommandStruct(tableName, CommandMode.Insert);
            }
            else
            {
                command = dbProvider.CreateCommandStruct(tableName, CommandMode.ModifyInsert);
            }
            //StringBuilder changeLog = new StringBuilder();
            //changeLog.AppendFormat("\"Keys\":\"{0}\"", data.GetKeyCode());
            //处理列
            foreach (string columnName in columns)
            {
                if (columnName.IsEmpty())
                {
                    continue;
                }
                try
                {
                    SchemaColumn schemaColumn;
                    if (schemaTable.Columns.TryGetValue(columnName, out schemaColumn))
                    {
                        if (schemaColumn.Disable || schemaColumn.IsIdentity)
                        {
                            continue;
                        }
                        object         value     = getFunc(data, schemaColumn);
                        IDataParameter parameter = CreateParameter(dbProvider, columnName, schemaColumn.DbType, value);
                        command.AddParameter(parameter);
                    }
                }
                catch (Exception ex)
                {
                    throw new Exception(string.Format("get {0} column val error.", columnName), ex);
                }
            }
            //处理条件
            string[] keyList = schemaTable.Keys;
            if (keyList.Length == 0)
            {
                throw new ArgumentNullException(string.Format("Table:{0} key is empty.", schemaTable.EntityName));
            }
            string condition = string.Empty;

            command.Filter = dbProvider.CreateCommandFilter();
            foreach (string columnName in keyList)
            {
                try
                {
                    SchemaColumn schemaColumn;
                    if (schemaTable.Columns.TryGetValue(columnName, out schemaColumn))
                    {
                        string keyName   = columnName;
                        string paramName = "F_" + columnName;
                        if (condition.Length > 0)
                        {
                            condition += " AND ";
                        }
                        condition += dbProvider.FormatFilterParam(schemaColumn.Name, "", paramName);
                        object         value     = getFunc(data, schemaColumn);
                        IDataParameter parameter = CreateParameter(dbProvider, paramName, schemaColumn.DbType, value);
                        command.Filter.AddParam(parameter);
                        //主键且自增列更新时,MSSQL与MySql处理不同,MySql需要有主键列
                        command.AddKey(CreateParameter(dbProvider, keyName, schemaColumn.DbType, value), schemaColumn.IsIdentity);
                    }
                }
                catch (Exception ex)
                {
                    throw new Exception(string.Format("get {0} column val error.", columnName), ex);
                }
            }
            command.Filter.Condition = condition;
            command.Parser();
            return(command);
        }