private static void FindEnumOld(TypedefItem type, EnumConfig enumConfig) { foreach (var item in type.Items.Values) { var oi = enumConfig.Items.FirstOrDefault(p => p.Option.ReferenceKey == item.Key); if (oi != null) { continue; } enumConfig.Add(oi = new EnumItem { Name = CoderBase.ToWordName(item.Name), Value = item.Value }); oi.Option.ReferenceKey = item.Key; } enumConfig.Option.ReferenceKey = type.Key; if (enumConfig.Items.All(p => !string.Equals(p.Name, "None", StringComparison.OrdinalIgnoreCase))) { enumConfig.Add(new EnumItem { Name = "None", Caption = "未知", Value = "0" }); } var items = enumConfig.Items.OrderBy(p => p.Value).ToArray(); enumConfig.Items.Clear(); foreach (var item in items) { enumConfig.Add(item); } }
private void DoImport() { _trace.Message1 = "连接数据库"; _trace.Track = _connectionString; using (MySqlConnection connection = new MySqlConnection(_connectionString)) { _trace.Track = "正在连接..."; connection.Open(); _trace.Track = "连接成功"; var tables = new List <string>(); _trace.Message1 = "分析数据表"; using (var cmd = connection.CreateCommand()) { _trace.Message2 = "读取表名"; _trace.Track = "正在读取表名..."; cmd.CommandText = $@"select Table_Name from information_schema.tables where table_schema='{_database}' and table_type='base table';"; using (var reader = cmd.ExecuteReader()) { if (!reader.HasRows) { _trace.Message1 = "没有任何表"; return; } while (reader.Read()) { tables.Add(reader.GetString(0)); } } _trace.Track = $@"读取成功({tables.Count})"; } _trace.Message1 = "分析表结构"; foreach (var t in tables) { string table = t; bool isnew = false; _trace.Message2 = table; var entity = _solution.Entities.FirstOrDefault(p => string.Equals(p.SaveTable, table, StringComparison.OrdinalIgnoreCase)); if (entity == null) { isnew = true; entity = new EntityConfig { ReadTableName = table, Name = CoderBase.ToWordName(table), Project = _database }; _trace.Track = @"新增的表"; entity.Caption = BaiduFanYi.FanYi(entity.Name); _dispatcher.Invoke(() => { _project.Entities.Add(entity); _solution.Entities.Add(entity); }); } _trace.Message3 = "列分析"; using (var cmd = connection.CreateCommand()) { LoadColumn(_database, cmd, table, entity, isnew); } } } _trace.Message1 = "完成"; }
/* * `TABLE_CATALOG` AS `TABLE_CATALOG`, * `TABLE_SCHEMA` AS `TABLE_SCHEMA`, * `TABLE_NAME` AS `TABLE_NAME`, * `COLUMN_NAME` AS `COLUMN_NAME`, * `ORDINAL_POSITION` AS `ORDINAL_POSITION`, * `COLUMN_DEFAULT` AS `COLUMN_DEFAULT`, * `IS_NULLABLE` AS `IS_NULLABLE`, * `DATA_TYPE` AS `DATA_TYPE`, * `CHARACTER_MAXIMUM_LENGTH` AS `CHARACTER_MAXIMUM_LENGTH`, * `CHARACTER_OCTET_LENGTH` AS `CHARACTER_OCTET_LENGTH`, * `NUMERIC_PRECISION` AS `NUMERIC_PRECISION`, * `NUMERIC_SCALE` AS `NUMERIC_SCALE`, * `DATETIME_PRECISION` AS `DATETIME_PRECISION`, * `CHARACTER_SET_NAME` AS `CHARACTER_SET_NAME`, * `COLLATION_NAME` AS `COLLATION_NAME`, * `COLUMN_TYPE` AS `COLUMN_TYPE`, * `COLUMN_KEY` AS `COLUMN_KEY`, * `EXTRA` AS `EXTRA`, * `PRIVILEGES` AS `PRIVILEGES`, * `COLUMN_COMMENT` AS `COLUMN_COMMENT`, * `GENERATION_EXPRESSION` AS `GENERATION_EXPRESSION` */ private void LoadColumn(string db, MySqlCommand cmd, string table, EntityConfig entity, bool isNewEntity) { cmd.CommandText = $@"select COLUMN_NAME,IS_Nullable,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,COLUMN_KEY,COLUMN_COMMENT,EXTRA from information_schema.columns where table_schema='{ db}' and table_name='{table}'"; using (var reader = cmd.ExecuteReader()) { if (!reader.HasRows) { return; } while (reader.Read()) { var field = reader.GetString(0); _trace.Message4 = field; if (field == null) { continue; } var dbType = reader.GetString(2); var column = entity.Properties.FirstOrDefault(p => string.Equals(p.ColumnName, field, StringComparison.OrdinalIgnoreCase)); bool isNew = isNewEntity; if (column == null) { _trace.Track = @"新字段"; isNew = true; column = new PropertyConfig { ColumnName = field, DbType = dbType, CsType = ToCstringType(dbType), Parent = entity }; InvokeInUiThread(() => entity.Properties.Add(column)); if (!reader.IsDBNull(5)) { column.Caption = reader.GetString(5); } column.Description = column.Caption; } else if (column.DbType != dbType) { _trace.Track = $@"字段类型变更:{column.DbType }->{dbType}"; column.DbType = dbType; column.CsType = ToCstringType(column.DbType); } column.DbNullable = reader.GetString(1) == "YES"; column.IsPrimaryKey = reader.GetString(4) == "PRI"; if (!reader.IsDBNull(3)) { column.Datalen = (int)reader.GetInt64(3); } if (!reader.IsDBNull(6)) { var ext = reader.GetString(6); column.IsIdentity = ext.Contains("auto_increment"); if (column.IsIdentity) { _trace.Track = @"自增列"; } } if (!isNew) { continue; } _trace.Track = @"分析属性名称"; switch (column.DbType.ToLower()) { case "varchar": case "longtext": column.Name = FirstBy(column.ColumnName, "m_str", "M_str", "m_", "M_"); break; case "int": case "tinyint": column.Name = FirstBy(column.ColumnName, "m_b", "m_n", "m_", "M_"); break; case "double": column.Name = FirstBy(column.ColumnName, "m_d", "m_", "M_"); break; default: column.Name = FirstBy(column.ColumnName, "m_", "M_"); break; } column.Name = CoderBase.ToWordName(column.Name ?? column.ColumnName); _trace.Track = $@"属性名称:{column.Name}"; if (string.IsNullOrWhiteSpace(column.Caption)) { column.Caption = BaiduFanYi.FanYi(column.Name); _trace.Track = $@"通过百度翻译得到中文名称:{column.Caption}"; } else { CheckEnum(column); if (column.EnumConfig != null) { column.EnumConfig.Name = column.Name + "Type"; column.EnumConfig.Caption = column.Caption + "自定义类型"; column.CustomType = column.EnumConfig.Name; _trace.Track = $@"解析得到枚举类型:{column.EnumConfig.Name},参考内容{column.EnumConfig.Description}"; } } if (string.IsNullOrWhiteSpace(column.Description)) { column.Description = column.Caption; } column.Caption = column.Caption.Split(CoderBase.NoneLanguageChar, 2)[0]; } } }