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