Exemple #1
0
        void GenParam(object data, MetaProperty prop, Expression cmdExpr, List <Expression> codes, List <ParameterExpression> locals)
        {
            var fname     = DbTrait.GetFieldname(prop);
            var paramExpr = Expression.Parameter(typeof(DbParameter), fname);

            locals.Add(paramExpr);
            codes.Add(Expression.Assign(paramExpr, Expression.Call(cmdExpr, CreateParameterMethodInfo)));
            codes.Add(Expression.Assign(Expression.PropertyOrField(paramExpr, "ParameterName"), Expression.Constant("@" + fname)));
            DbType dbType = DbType.String;

            this.Trait.DataTypeMaps.TryGetValue(prop.NonullableType.GUID, out dbType);
            codes.Add(Expression.Assign(Expression.PropertyOrField(paramExpr, "DbType"), Expression.Constant(dbType)));
            var        value     = prop.GetValue(data);
            Expression valueExpr = null;

            if (prop.Nullable)
            {
                int?x;

                valueExpr = Expression.Condition(
                    Expression.PropertyOrField(Expression.Constant(value), "HasValue")
                    , Expression.PropertyOrField(Expression.Constant(value), "Value")
                    , Expression.Constant(prop.DefaultValue)
                    );
            }
            else
            {
                valueExpr = Expression.Constant(prop.PropertyType.IsClass?value.ToString():value);
            }
            codes.Add(Expression.Assign(Expression.PropertyOrField(paramExpr, "Value"), valueExpr));

            //DbParameter par;
            //par.Value
        }
Exemple #2
0
        public string CreateTableSql(EntityModel cls, string prefix = null)
        {
            var sb = new StringBuilder("CREATE TABLE ");

            sb.Append(this.Trait.MakeSqlTablename(cls, prefix));
            sb.Append("(\n");
            bool hasId     = false;
            bool hasFields = false;

            foreach (EntityProperty prop in cls)
            {
                //Name
                if (prop.GetAttribute <NotFieldAttribute>() != null)
                {
                    continue;
                }
                var fieldName    = DbTrait.GetFieldname(prop);
                var sqlFieldname = this.Trait.MakeSqlFieldname(fieldName);
                if (fieldName == null)
                {
                    continue;
                }
                if (hasFields)
                {
                    sb.Append("\t,");
                }
                else
                {
                    sb.Append("\t"); hasFields = true;
                }
                sb.Append(sqlFieldname);

                sb.Append(" ").Append(this.Trait.GetSqlFieldTypeAndPrecision(prop));

                if (prop.Nullable || prop.PropertyType.IsClass)
                {
                    sb.Append(" NULL");
                }
                else
                {
                    sb.Append(" NOT NULL");
                }

                if (fieldName == "Id" || fieldName == "id" || fieldName == "ID" || fieldName == cls.Name + "Id" || fieldName == cls.Name + "ID")
                {
                    if (!hasId)
                    {
                        sb.Append(" PRIMARY KEY");
                    }
                    hasId = true;
                }
                sb.Append("\n");
            }
            sb.Append(")");

            return(sb.ToString());
        }
Exemple #3
0
        string GenSql(object entity)
        {
            var sql_fields = "";
            var sql_values = "";

            foreach (var prop in this.Model.Members)
            {
                if (prop.GetAttribute <NotFieldAttribute>() != null)
                {
                    continue;
                }
                var fname = this.Trait.MakeSqlFieldname(prop);
                if (fname == null)
                {
                    continue;
                }
                if (sql_fields != string.Empty)
                {
                    sql_fields += ",";
                }
                if (sql_values != string.Empty)
                {
                    sql_values += ",";
                }
                sql_fields += fname;
                switch (this.Trait.ParametricKind)
                {
                case SqlParametricKinds.At:
                    sql_values += "@" + fname; break;

                case SqlParametricKinds.Question:
                    sql_values += "?"; break;

                default:
                    var hasValue = prop.HasValue(entity);
                    if (!hasValue)
                    {
                        if (prop.Nullable)
                        {
                            sql_values += "NULL";
                        }
                        else
                        {
                            sql_values += prop.DefaultValue.ToString();
                        }
                    }
                    else
                    {
                        var val = prop.EnsureValue(entity);
                        if (val == null)
                        {
                            sql_values += "''";
                        }
                        sql_values += DbTrait.SqlValue(val.ToString());
                    }
                    break;
                }
            }

            return("(" + sql_fields + ") VALUES(" + sql_values + ")");
        }
Exemple #4
0
        string GenSql(object entity)
        {
            var sql_fields = "";
            var sql_values = "";

            foreach (var pair in this.Sql.AllowedProps)
            {
                var fname = this.Sql.DbTrait.SqlFieldname(pair.Key);
                var prop  = pair.Value;
                if (fname == null)
                {
                    continue;
                }
                if (sql_fields != string.Empty)
                {
                    sql_fields += ",";
                }
                if (sql_values != string.Empty)
                {
                    sql_values += ",";
                }
                sql_fields += fname;
                switch (this.Sql.DbTrait.ParametricKind)
                {
                case SqlParametricKinds.At:
                    sql_values += "@" + fname; break;

                case SqlParametricKinds.Question:
                    sql_values += "?"; break;

                default:
                    var nullable  = prop.Nullable;
                    var fieldAttr = prop.GetAttribute <DbFieldAttribute>();
                    if (fieldAttr != null && fieldAttr.IsNullable)
                    {
                        nullable = true;
                    }

                    var hasValue = prop.HasValue(entity);
                    if (!hasValue)
                    {
                        if (nullable)
                        {
                            sql_values += "NULL";
                        }
                        else
                        {
                            sql_values += DbTrait.SqlValue(prop.DefaultValue, false, prop.DefaultValue) ?? "''";
                        }
                    }
                    else
                    {
                        var val = prop.EnsureValue(entity);
                        if (val == null)
                        {
                            sql_values += "''";
                        }
                        sql_values += DbTrait.SqlValue(val.ToString());
                    }
                    break;
                }
            }

            return("(" + sql_fields + ") VALUES(" + sql_values + ")");
        }
Exemple #5
0
        Delegate GenFill(bool retTyped = false)
        {
            var readerExpr = Expression.Parameter(typeof(IDataReader), "reader");
            var indexExpr  = Expression.Parameter(typeof(int), "index");
            var valObjExpr = Expression.Parameter(typeof(object), "valObj");
            var entityExpr = Expression.Parameter(this.Model.Type, "entity");

            int i     = 0;
            var codes = new List <Expression>();

            codes.Add(Expression.Assign(entityExpr, Expression.New(this.Model.Type)));
            foreach (var member in this.Model.Members)
            {
                var fieldname = DbTrait.GetFieldname(member);
                if (fieldname == null)
                {
                    continue;
                }
                //codes.Add();
                //if(member.)
                var readReaderExpr = Expression.Assign(
                    valObjExpr,
                    Expression.Call(readerExpr, DataReaderGetItemMethod, Expression.PostIncrementAssign(indexExpr))
                    );
                codes.Add(readReaderExpr);
                Expression convertExpr = null;
                if (member.Nullable)
                {
                    var ctorMethod = member.PropertyType.GetConstructors().First(p => p.GetParameters().Length == 1);

                    convertExpr = Expression.New(ctorMethod,
                                                 Expression.Convert(valObjExpr, member.NonullableType)
                                                 );
                }
                else
                {
                    convertExpr = Expression.Convert(valObjExpr, member.NonullableType);
                }

                var chkDbNullExpr = Expression.IfThen(
                    Expression.NotEqual(valObjExpr, Expression.Constant(DBNull.Value))
                    , Expression.Assign(
                        Expression.PropertyOrField(entityExpr, member.Name)
                        , convertExpr
                        )
                    );
                codes.Add(chkDbNullExpr);
            }
            var retLabel = Expression.Label();

            codes.Add(Expression.Return(retLabel, retTyped ? entityExpr : (Expression)Expression.Convert(entityExpr, typeof(object))));
            codes.Add(Expression.Label(retLabel));

            var block = Expression.Block(new List <ParameterExpression> {
                valObjExpr, entityExpr
            }, codes);
            //IDataReader rs;rs[]
            var lamda = Expression.Lambda(block, readerExpr);

            return(lamda.Compile());
        }