Ejemplo n.º 1
0
        private void SerializeField(TableInfo table, Type type)
        {
            var properties = MyStagingUtils.GetDbFields(type);

            foreach (var pi in properties)
            {
                var fi = new DbFieldInfo();
                fi.Name = pi.Name;
                var customAttributes = pi.GetCustomAttributes();
                var genericAttrs     = customAttributes.Select(f => f.GetType()).ToArray();
                var pk = pi.GetCustomAttribute <PrimaryKeyAttribute>();
                fi.PrimaryKey = pk != null;
                if (fi.PrimaryKey)
                {
                    fi.AutoIncrement = pk.AutoIncrement;
                }

                if (pi.PropertyType.Name == "Nullable`1")
                {
                    fi.NotNull = false;
                    fi.CsType  = pi.PropertyType.GenericTypeArguments[0].Name;
                }
                else
                {
                    fi.CsType = pi.PropertyType.Name;
                    if (pi.PropertyType == typeof(string))
                    {
                        fi.NotNull = fi.PrimaryKey || genericAttrs.Where(f => f == typeof(RequiredAttribute)).FirstOrDefault() != null;
                    }
                    else
                    {
                        fi.NotNull = pi.PropertyType.IsValueType;
                    }
                }

                var columnAttribute = customAttributes.Where(f => f.GetType() == typeof(ColumnAttribute)).FirstOrDefault();
                if (columnAttribute != null)
                {
                    var colAttribute = ((ColumnAttribute)columnAttribute);
                    fi.DbType = fi.DbTypeFull = colAttribute.TypeName;
                }
                else
                {
                    fi.DbType     = PgsqlType.GetDbType(fi.CsType.Replace("[]", ""));
                    fi.DbTypeFull = GetFullDbType(fi);
                }
                fi.IsArray = fi.CsType.Contains("[]");

                table.Fields.Add(fi);
            }
        }
Ejemplo n.º 2
0
        private void Get_Fields()
        {
            string _sqltext = @"SELECT a.oid
,c.attnum as num
,c.attname as field
, (case when f.character_maximum_length is null then c.attlen else f.character_maximum_length end) as length
,c.attnotnull as notnull
,d.description as comment
,(case when e.typcategory ='G' then e.typname when e.typelem = 0 then e.typname else e2.typname end) as type
,(case when e.typelem = 0 then e.typtype else e2.typtype end) as data_type
,e.typcategory
,f.is_identity
                                from  pg_class a 
                                inner join pg_namespace b on a.relnamespace=b.oid
                                inner join pg_attribute c on attrelid = a.oid
                                LEFT OUTER JOIN pg_description d ON c.attrelid = d.objoid AND c.attnum = d.objsubid and c.attnum > 0
                                inner join pg_type e on e.oid=c.atttypid
                                left join pg_type e2 on e2.oid=e.typelem
                                inner join information_schema.columns f on f.table_schema = b.nspname and f.table_name=a.relname and column_name = c.attname
                                WHERE b.nspname='{0}' and a.relname='{1}';";

            _sqltext = string.Format(_sqltext, this.schemaName, this.table.name);


            PgSqlHelper.ExecuteDataReader(dr =>
            {
                FieldInfo fi   = new FieldInfo();
                fi.Oid         = Convert.ToInt32(dr["oid"]);
                fi.Field       = dr["field"].ToString();
                fi.Length      = Convert.ToInt32(dr["length"].ToString());
                fi.Is_not_null = Convert.ToBoolean(dr["notnull"]);
                fi.Comment     = dr["comment"].ToString();
                fi.Data_Type   = dr["data_type"].ToString();
                fi.Db_type     = dr["type"].ToString();
                fi.Db_type     = fi.Db_type.StartsWith("_") ? fi.Db_type.Remove(0, 1) : fi.Db_type;
                fi.PgDbType    = PgsqlType.SwitchToSql(fi.Data_Type, fi.Db_type);
                fi.Is_identity = dr["is_identity"].ToString() == "YES";
                fi.Is_array    = dr["typcategory"].ToString() == "A";
                fi.Is_enum     = fi.Data_Type == "e";

                fi.CsType = PgsqlType.SwitchToCSharp(fi.Db_type);

                if (fi.Is_enum)
                {
                    fi.CsType = fi.CsType.ToUpperPascal();
                }
                string _notnull = "";
                if (
                    fi.CsType != "string" &&
                    fi.CsType != "byte[]" &&
                    fi.CsType != "JToken" &&
                    !fi.Is_array &&
                    fi.CsType != "System.Net.IPAddress" &&
                    fi.CsType != "System.Net.NetworkInformation.PhysicalAddress" &&
                    fi.CsType != "System.Xml.Linq.XDocument" &&
                    fi.CsType != "System.Collections.BitArray" &&
                    fi.CsType != "object"
                    )
                {
                    _notnull = fi.Is_not_null ? "" : "?";
                }

                string _array = fi.Is_array ? "[]" : "";
                fi.RelType    = $"{fi.CsType}{_notnull}{_array}";
                // dal
                this.fieldList.Add(fi);
            }, CommandType.Text, _sqltext);
        }
Ejemplo n.º 3
0
        protected void Update_Generator(StreamWriter writer, string class_model, string dal_name)
        {
            List <string> d_key        = new List <string>();
            List <string> d_key_fields = new List <string>();

            foreach (var item in pkList)
            {
                FieldInfo fs = fieldList.FirstOrDefault(f => f.Field == item.Field);
                d_key.Add(fs.RelType + " " + fs.Field);
                d_key_fields.Add(fs.Field);
            }
            string updateName = CreateName() + "UpdateBuilder";

            if (d_key.Count > 0)
            {
                writer.WriteLine($"\t\tpublic static {updateName} Update({string.Join(",", d_key)})");
                writer.WriteLine("\t\t{");
                writer.WriteLine($"\t\t\treturn new {updateName}(null, {string.Join(",", d_key_fields)});");
                writer.WriteLine("\t\t}");
                writer.WriteLine();
            }

            writer.WriteLine($"\t\tpublic static {updateName} UpdateBuilder {{ get {{ return new {updateName}(); }} }}");
            writer.WriteLine();

            string dkString   = d_key.Count > 0 ? $"{ string.Join(",", d_key)}" : "";
            var    modelUpper = class_model.ToUpperPascal();

            writer.WriteLine($"\t\tpublic class {updateName} : UpdateBuilder<{modelUpper}>");
            writer.WriteLine("\t\t{");

            void CreateConstructor(string paramString, string onChange = null)
            {
                var baseT = onChange == null ? "" : " : base(onChanged)";

                writer.WriteLine($"\t\t\tpublic {updateName}({onChange}{dkString}){baseT}");
                writer.WriteLine("\t\t\t{");
                if (pkList.Count > 0)
                {
                    writer.Write($"\t\t\t\tbase.Where(f => ");
                    for (int i = 0; i < pkList.Count; i++)
                    {
                        var item = pkList[i];
                        writer.Write($"f.{item.Field.ToUpperPascal()} == {item.Field}");
                        if (i + 1 < pkList.Count)
                        {
                            writer.Write(" && ");
                        }
                    }
                    writer.Write(");\n");
                }
                writer.WriteLine("\t\t\t}");
            }

            // 默认构造函数
            CreateConstructor(dkString);
            writer.WriteLine();
            // 重载构造函数
            var separator = d_key.Count > 0 ? ", " : "";

            CreateConstructor(dkString, $"Action<{modelUpper}> onChanged" + separator);

            if (d_key.Count > 0)
            {
                writer.WriteLine();
                writer.WriteLine($"\t\t\tpublic {updateName}() {{ }}");
                writer.WriteLine();
            }

            writer.WriteLine($"\t\t\tpublic new {updateName} Where(Expression<Func<{class_model.ToUpperPascal()}, bool>> predicate)");
            writer.WriteLine("\t\t\t{");
            writer.WriteLine($"\t\t\t\t base.Where(predicate);");
            writer.WriteLine($"\t\t\t\t return this;");
            writer.WriteLine("\t\t\t}");
            writer.WriteLine();

            writer.WriteLine($"\t\t\tpublic new {updateName} Where(string formatCommad, params object[] pValue)");
            writer.WriteLine("\t\t\t{");
            writer.WriteLine($"\t\t\t\t base.Where(formatCommad,pValue);");
            writer.WriteLine($"\t\t\t\t return this;");
            writer.WriteLine("\t\t\t}");
            writer.WriteLine();

            foreach (var item in fieldList)
            {
                if (item.Is_identity)
                {
                    continue;
                }
                NpgsqlDbType _dbtype = PgsqlType.SwitchToSql(item.Data_Type, item.Db_type);

                writer.WriteLine($"\t\t\tpublic {updateName} Set{item.Field.ToUpperPascal()}({item.RelType} {item.Field})");
                writer.WriteLine("\t\t\t{");
                string specificType = GetspecificType(item);
                string ap           = item.Is_array ? " | NpgsqlDbType.Array" : "";
                writer.WriteLine($"\t\t\t\treturn base.SetField(\"{ item.Field}\", NpgsqlDbType.{_dbtype}{ap}, {item.Field}, {item.Length}, {specificType}) as {updateName};");
                writer.WriteLine("\t\t\t}");

                if (item.Is_array)
                {
                    writer.WriteLine($"\t\t\tpublic {updateName} Set{item.Field.ToUpperPascal()}Append({item.CsType} {item.Field})");
                    writer.WriteLine("\t\t\t{");
                    writer.WriteLine($"\t\t\t\treturn base.SetArrayAppend(\"{ item.Field}\", NpgsqlDbType.{_dbtype}, {item.Field}, {item.Length}, {specificType}) as {updateName};");
                    writer.WriteLine("\t\t\t}");

                    writer.WriteLine($"\t\t\tpublic {updateName} Set{item.Field.ToUpperPascal()}Remove({item.CsType} {item.Field})");
                    writer.WriteLine("\t\t\t{");
                    writer.WriteLine($"\t\t\t\treturn base.SetArrayRemove(\"{ item.Field}\", NpgsqlDbType.{_dbtype}, {item.Field}, {item.Length}, {specificType}) as {updateName};");
                    writer.WriteLine("\t\t\t}");
                }
                writer.WriteLine();
            }
            writer.WriteLine("\t\t}");
        }
Ejemplo n.º 4
0
        private void GetFields(TableInfo table)
        {
            string _sqltext = @"SELECT a.oid
                                            ,c.attnum as num
                                            ,c.attname as field
                                            ,c.attnotnull as notnull
                                            ,d.description as comment
                                            ,(case when e.typcategory ='G' then e.typname when e.typelem = 0 then e.typname else e2.typname end) as type
                                            ,(case when e.typelem = 0 then e.typtype else e2.typtype end) as data_type
                                            ,COALESCE((
                                            case 
                                            when (case when e.typcategory ='G' then e.typname when e.typelem = 0 then e.typname else e2.typname end) in ('numeric','int2','int4','int8','float4','float8') then f.numeric_precision
                                            when (case when e.typcategory ='G' then e.typname when e.typelem = 0 then e.typname else e2.typname end) in ('timestamp','timestamptz','interval','time','date','timetz') then f.datetime_precision
                                            when f.character_maximum_length is null then 0
                                            else f.character_maximum_length 
                                            end
                                            ),0) as length
                                            ,COALESCE((
                                            case 
                                            when (case when e.typcategory ='G' then e.typname when e.typelem = 0 then e.typname else e2.typname end) in ('numeric') then f.numeric_scale
                                            else 0
                                            end
                                            ),0) numeric_scale
                                            ,e.typcategory
                                            ,f.udt_schema
                                            ,f.column_default
                                                                            from  pg_class a 
                                                                            inner join pg_namespace b on a.relnamespace=b.oid
                                                                            inner join pg_attribute c on attrelid = a.oid
                                                                            LEFT OUTER JOIN pg_description d ON c.attrelid = d.objoid AND c.attnum = d.objsubid and c.attnum > 0
                                                                            inner join pg_type e on e.oid=c.atttypid
                                                                            left join pg_type e2 on e2.oid=e.typelem
                                                                            inner join information_schema.columns f on f.table_schema = b.nspname and f.table_name=a.relname and column_name = c.attname
                                                                            WHERE b.nspname='{0}' and a.relname='{1}';";

            _sqltext = string.Format(_sqltext, table.Schema, table.Name);
            dbContext.Execute.ExecuteDataReader(dr =>
            {
                DbFieldInfo fi = new DbFieldInfo
                {
                    Oid           = Convert.ToInt32(dr["oid"]),
                    Name          = dr["field"].ToString(),
                    Length        = Convert.ToInt32(dr["length"].ToString()),
                    NotNull       = Convert.ToBoolean(dr["notnull"]),
                    Comment       = dr["comment"].ToString(),
                    Numeric_scale = Convert.ToInt32(dr["numeric_scale"].ToString()),
                    ColumnDefault = dr["column_default"].ToString(),
                };

                var udt_schema   = dr["udt_schema"].ToString();
                var typcategory  = dr["typcategory"].ToString();
                var dbtype       = dr["type"].ToString();
                fi.DbType        = typcategory == "E" ? udt_schema + "." + dbtype : dbtype;
                fi.IsArray       = typcategory == "A";
                fi.CsType        = PgsqlType.SwitchToCSharp(dbtype);
                fi.AutoIncrement = fi.ColumnDefault != null && fi.ColumnDefault.StartsWith("nextval('") && fi.ColumnDefault.EndsWith("'::regclass)");

                string _notnull = "";
                if (
                    fi.CsType != "string" &&
                    fi.CsType != "byte[]" &&
                    fi.CsType != "JToken" &&
                    !fi.IsArray &&
                    fi.CsType != "System.Net.IPAddress" &&
                    fi.CsType != "System.Net.NetworkInformation.PhysicalAddress" &&
                    fi.CsType != "System.Xml.Linq.XDocument" &&
                    fi.CsType != "System.Collections.BitArray" &&
                    fi.CsType != "object"
                    )
                {
                    _notnull = fi.NotNull ? "" : "?";
                }

                string _array = fi.IsArray ? "[]" : "";
                fi.RelType    = $"{fi.CsType}{_notnull}{_array}";

                if (fi.RelType == "string" && (fi.Length != 0 && fi.Length != 255))
                {
                    fi.DbTypeFull = $"{fi.DbType}({fi.Length})";
                }
                else if (fi.Numeric_scale > 0)
                {
                    fi.DbTypeFull = ($"{fi.DbType}({fi.Length},{fi.Numeric_scale})");
                }
                else if (PgsqlType.ContrastType(fi.DbType) == null)
                {
                    fi.DbTypeFull = fi.DbType;
                }

                table.Fields.Add(fi);
            }, CommandType.Text, _sqltext);

            if (table.Type == TableType.Table)
            {
                GetPrimarykey(table);
            }
        }