示例#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 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);
        }
示例#3
0
        private CommandStruct GenerateCommand <T>(DbBaseProvider dbProvider, T data, SchemaTable schemaTable, bool isChange, EntityBeforeProcess handle) where T : AbstractEntity
        {
            CommandStruct command = null;

            if (!schemaTable.IsStoreInDb ||
                (string.IsNullOrEmpty(schemaTable.ConnectKey) &&
                 string.IsNullOrEmpty(schemaTable.ConnectionString)))
            {
                return(null);
            }

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

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

                SchemaColumn schemaColumn;
                if (schemaTable.Columns.TryGetValue(columnName, out schemaColumn))
                {
                    if (schemaColumn.Disable || schemaColumn.IsIdentity)
                    {
                        continue;
                    }
                    object value = data.GetPropertyValue(schemaColumn.CanRead, columnName);
                    if (handle != null)
                    {
                        var e = new EntityEvent()
                        {
                            Data = data, FieldName = columnName, FieldValue = value
                        };
                        value = handle(e);
                    }
                    if (CovertDataValue(schemaTable, schemaColumn, ref value))
                    {
                        //changeLog.AppendFormat(",\"{0}\":\"{1}\"", columnName, value);
                        IDataParameter parameter = CreateParameter(dbProvider, columnName, schemaColumn.DbType, value);
                        command.AddParameter(parameter);
                    }
                }
            }
            //处理条件
            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)
            {
                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 = data.GetPropertyValue(schemaColumn.CanRead, columnName);
                    if (handle != null)
                    {
                        var e = new EntityEvent()
                        {
                            Data = data, FieldName = columnName, FieldValue = value
                        };
                        value = handle(e);
                    }
                    if (CovertDataValue(schemaTable, schemaColumn, ref value))
                    {
                        IDataParameter parameter = CreateParameter(dbProvider, paramName, schemaColumn.DbType, value);
                        command.Filter.AddParam(parameter);
                        if (!schemaColumn.IsIdentity)
                        {
                            command.AddKey(CreateParameter(dbProvider, keyName, schemaColumn.DbType, value));
                        }
                    }
                }
            }
            command.Filter.Condition = condition;
            command.Parser();
            return(command);
        }