Example #1
0
        private TranslateResult TranslateValues(object instance, Type type, List <Parameter> parameters)
        {
            TableSchema tableSchema = TableSchemaResolver.GetTableSchema(type);

            for (int i = 0, count = tableSchema.FieldsSchema.Count; i < count; i++)
            {
                var    field = tableSchema.FieldsSchema[i];
                object value = ExpressionFunc.GetPropertyValue(instance, type, field.PropertyInfo);
                if (value == null && field.PropertyInfo.PropertyType.Name == "String")
                {
                    value = "";
                }

                if (parameters == null)
                {
                    clauseBuilder.AppendClause(parameterBuilder.GenerateParameterName(), value);
                }
                else
                {
                    clauseBuilder.AppendClause(parameters[i].Name, value);
                }
            }

            return(new TranslateResult
            {
                CommandText = clauseBuilder.GetExpressionText(","),                 // INSERT ... VALUES(@value1,@value2,@value3,...)
                Parameters = clauseBuilder.GetExpressionParameters(),
            });
        }
Example #2
0
        private void InsertRecordToCache(TTable record)
        {
            Func <TTable, TTable> cloneFunc = ExpressionFunc.PrimaryKeyClone <TTable>();

            this._recordsCache.Add(new RecordCache <TTable>
            {
                recordOut   = record,
                recordCache = cloneFunc(record)
            });
        }
Example #3
0
        internal List <RecordCache <TTable> > Excute <TTable>(string sqlCommand, List <Parameter> parameters, List <bool> fieldsUsable) where TTable : new()
        {
            dbError = new DbError();

            if (string.IsNullOrEmpty(connection.ConnectionString))
            {
                return(null);
            }

            Func <DbDataReader, TTable> readRowFunc = ExpressionFunc.GetReader <TTable>(fieldsUsable);
            Func <TTable, TTable>       cloneFunc   = ExpressionFunc.PrimaryKeyClone <TTable>();

            if (readRowFunc == null || cloneFunc == null)
            {
                return(null);
            }

            if (connection.State != ConnectionState.Open)
            {
                connection.Open();
            }

            try
            {
                // Create the command and open the connection
                var command = connection.CreateCommand();
                command.CommandText    = sqlCommand;
                command.CommandTimeout = 15;
                command.CommandType    = CommandType.Text;
                if (parameters != null)
                {
                    for (int index = 0; index < parameters.Count; index++)
                    {
                        var dbParameter = command.CreateParameter();
                        dbParameter.ParameterName = parameters[index].Name;
                        dbParameter.Value         = parameters[index].Value;

                        command.Parameters.Add(dbParameter);
                    }
                }

                // Create the DataReader to retrieve data
                using (var dr = command.ExecuteReader(CommandBehavior.CloseConnection))
                {
                    return(ReadRecords <TTable>(dr, readRowFunc, cloneFunc));
                }
            }
            catch (Exception e)
            {
                dbError.Code = ErrorCode.DatabaseException;
                dbError.Text = e.Message;

                return(null);
            }
        }
Example #4
0
        public override void Initialize(MemberInfo member, Type memberValueType)
        {
            if (this.Attribute.MemberName != null && this.Attribute.MemberName.Length > 0 && this.Attribute.MemberName[0] == '@')
            {
                var expression = this.Attribute.MemberName.Substring(1);

                var emitContext = new EmitContext()
                {
                    IsStatic       = member.IsStatic(),
                    ReturnType     = typeof(bool),
                    Type           = member.ReflectedType,
                    Parameters     = new Type[] { member.GetReturnType() },
                    ParameterNames = new string[] { "value" }
                };

                var del = ExpressionUtility.ParseExpression(expression, emitContext, out this.memberErrorMessage);

                if (emitContext.IsStatic)
                {
                    this.staticValidationExpression = (ExpressionFunc <T, bool>)del;
                }
                else
                {
                    this.instanceValidationExpression = del;
                }
            }
            else
            {
                LegacyFindMember(member);
            }

            this.defaultMessageString = this.Attribute.DefaultMessage ?? "Value is invalid for member '" + member.Name + "'";
            this.defaultResultType    = this.Attribute.MessageType.ToValidationResultType();

            if (this.Attribute.DefaultMessage != null)
            {
                this.validationMessageHelper = new StringMemberHelper(member.ReflectedType, false, this.Attribute.DefaultMessage);

                if (this.validationMessageHelper.ErrorMessage != null)
                {
                    if (this.memberErrorMessage != null)
                    {
                        this.memberErrorMessage += "\n\n" + this.validationMessageHelper.ErrorMessage;
                    }
                    else
                    {
                        this.memberErrorMessage = this.validationMessageHelper.ErrorMessage;
                    }

                    this.validationMessageHelper = null;
                }
            }
        }
Example #5
0
        private TranslateResult TranslateColumnValue(object instance, Type type, List <bool> fieldsUsable, List <Parameter> parameters)
        {
            bool isFirst = true;

            TableSchema tableSchema = TableSchemaResolver.GetTableSchema(type);

            for (int i = 0, count = tableSchema.FieldsSchema.Count; i < count; i++)
            {
                var field = tableSchema.FieldsSchema[i];
                if (fieldsUsable[i] && field.IsPrimaryKey == false)
                {
                    object value = ExpressionFunc.GetPropertyValue(instance, type, field.PropertyInfo);
                    if (value == null && field.PropertyInfo.PropertyType.Name == "String")
                    {
                        value = "";
                    }
                    if (value == null)
                    {
                        throw new NotSupportedException(string.Format("The field '{0}' is not supported", field.FieldName));
                    }
                    if (!isFirst)
                    {
                        clauseBuilder.AppendClause(",");
                    }
                    clauseBuilder.AppendClause(field.FieldName);
                    clauseBuilder.AppendClause("=");
                    if (field.IsUpdCount)
                    {
                        int iValue = Convert.ToInt32(value);
                        if (iValue == short.MaxValue)
                        {
                            iValue = 1;
                        }
                        else
                        {
                            iValue++;
                        }
                        value = Convert.ChangeType(iValue, field.PropertyInfo.PropertyType);
                        ExpressionFunc.SetPropertyValue(instance, type, field.PropertyInfo, value);
                    }
                    clauseBuilder.AppendClause(parameterBuilder.GenerateParameterName(), value);
                    isFirst = false;
                }
            }

            return(new TranslateResult
            {
                CommandText = clauseBuilder.GetExpressionText(),                    // UPDATE ... column1=@value1,column2=@value2,...
                Parameters = clauseBuilder.GetExpressionParameters(),
            });
        }
Example #6
0
        private TranslateResult TranslateWhere(object instance, Type type, List <Parameter> parameters)
        {
            bool isFirst = true;

            TableSchema tableSchema = TableSchemaResolver.GetTableSchema(type);
            int         paramIndex  = 0;

            for (int i = 0, count = tableSchema.FieldsSchema.Count; i < count; i++)
            {
                var field = tableSchema.FieldsSchema[i];
                if (field.IsPrimaryKey || field.IsUpdCount)
                {
                    object value = ExpressionFunc.GetPropertyValue(instance, type, field.PropertyInfo);
                    if (value == null)
                    {
                        throw new NotSupportedException(string.Format("The field '{0}' is not supported", field.FieldName));
                    }
                    if (!isFirst)
                    {
                        clauseBuilder.AppendClause(" And ");
                    }
                    clauseBuilder.AppendClause(field.FieldName);
                    clauseBuilder.AppendClause("=");
                    if (parameters == null)
                    {
                        clauseBuilder.AppendClause(parameterBuilder.GenerateParameterName(), value);
                    }
                    else
                    {
                        clauseBuilder.AppendClause(parameters[paramIndex++].Name, value);
                    }
                    isFirst = false;
                }
            }
            return(new TranslateResult
            {
                CommandText = clauseBuilder.GetExpressionText(),                    // UPDATE ...Where key_column=some_value And UpdCount=some_value
                // DELETE ...Where key_column=some_value And UpdCount=some_value
                Parameters = clauseBuilder.GetExpressionParameters(),
            });
        }
Example #7
0
        public bool Update(List <TTable> records)
        {
            if (records == null || records.Count == 0)
            {
                return(false);
            }

            Action <TTable, TTable> copyAction = ExpressionFunc.PrimaryKeyCopy <TTable>();

            List <List <Parameter> > listParameters = new List <List <Parameter> >();

            Tuple <TranslateResult, TranslateResult> resultFirst = null;
            Tuple <TranslateResult, TranslateResult> resultNext  = null;

            for (int i = 0, count = records.Count; i < count; i++)
            {
                var record = records[i];
                if (IsValidRecord(record) == false)
                {
                    return(false);
                }

                copyAction(record, GetCacheRecord(record));

                List <Parameter> parameters = new List <Parameter>();
                if (i == 0)
                {
                    resultFirst = PreUpdate(record, null, null);

                    parameters.AddRange(resultFirst.Item1.Parameters);
                    parameters.AddRange(resultFirst.Item2.Parameters);
                }
                else
                {
                    resultNext = PreUpdate(record, resultFirst.Item1.Parameters, resultFirst.Item2.Parameters);

                    parameters.AddRange(resultNext.Item1.Parameters);
                    parameters.AddRange(resultNext.Item2.Parameters);
                }

                listParameters.Add(parameters);
            }

            _dbSet.BeginTransaction();

            if (listParameters.Count == 1)
            {
                this._dbError = _excuteUpdate.Excute <TTable>(_sqlBuilder.Update(), listParameters[0], _dbSet.Transaction);
            }
            else
            {
                this._dbError = _excuteUpdate.ExcuteBatch <TTable>(_sqlBuilder.Update(), listParameters, _dbSet.Transaction);
            }

            if (this._dbError.Code == ErrorCode.Success)
            {
                records.ForEach(rec => copyAction(GetCacheRecord(rec), rec));
            }
            else
            {
                _dbSet.Cancel();
            }

            return(this._dbError.Code == ErrorCode.Success);
        }
Example #8
0
        public bool Delete(List <TTable> records)
        {
            if (records == null || records.Count == 0)
            {
                return(false);
            }

            Action <TTable, TTable> copyAction = ExpressionFunc.PrimaryKeyCopy <TTable>();

            List <List <Parameter> > listParameters = new List <List <Parameter> >();

            TranslateResult resultFirst = null;
            TranslateResult resultNext  = null;

            for (int i = 0, count = records.Count; i < count; i++)
            {
                var record = records[i];
                if (IsValidRecord(record) == false)
                {
                    return(false);
                }

                copyAction(record, GetCacheRecord(record));

                if (i == 0)
                {
                    resultFirst = _translate.Translator(record, typeof(TTable), _fieldsUsable, ClauseType.SaveWhere);
                    _sqlBuilder.SaveWhere(resultFirst.CommandText);
                    listParameters.Add(resultFirst.Parameters);
                }
                else
                {
                    resultNext = _translate.Translator(record, typeof(TTable), _fieldsUsable, ClauseType.SaveWhere, resultFirst.Parameters);
                    listParameters.Add(resultNext.Parameters);
                }
            }

            TableSchema tableSchema = TableSchemaResolver.GetTableSchema(typeof(TTable));

            _sqlBuilder.From(tableSchema.PrimaryTable);

            _dbSet.BeginTransaction();

            if (listParameters.Count == 1)
            {
                this._dbError = _excuteUpdate.Excute <TTable>(_sqlBuilder.Delete(), listParameters[0], _dbSet.Transaction);
            }
            else
            {
                this._dbError = _excuteUpdate.ExcuteBatch <TTable>(_sqlBuilder.Delete(), listParameters, _dbSet.Transaction);
            }

            if (this._dbError.Code == ErrorCode.Success)
            {
                records.ForEach(rec => DeleteRecordFromCache(rec));
            }
            else
            {
                _dbSet.Cancel();
            }

            return(this._dbError.Code == ErrorCode.Success);
        }