private void AddTopSchemaTupleItem(IObjectSchema schema, SchemaInfoTuple schemaInfo) { if (!this.TopObjectSchemaInfoTupleTable.ContainsKey(schema)) { this.TopObjectSchemaInfoTupleTable.Add(schema, schemaInfo); } }
public static void CompleteSchema(ISchemaProvider provider, SchemaInfoTuple schemaInfo) { switch (schemaInfo.SchemaType) { case SchemaType.Table: { var columnSchemas = provider.LoadColumnSchemaList(schemaInfo.ObjectSchema.Name); schemaInfo.ColumnSchemas = new List <ColumnSchemaExtend>(columnSchemas); var indexSchemas = provider.LoadIndexSchemaList(schemaInfo.ObjectSchema.Name); schemaInfo.IndexColumnSchemas = new List <IndexSchema>(indexSchemas); } break; case SchemaType.View: { var columnSchems = provider.LoadViewColumnSchemaList(schemaInfo.ObjectSchema.Name); schemaInfo.ColumnSchemas = new List <ColumnSchemaExtend>(columnSchems); } break; case SchemaType.Procedure: { } break; case SchemaType.Function: { } break; } }
private async Task CompleteSchema(SchemaInfoTuple schemaInfo) { this.ShowTipInformation($"正在补全 [{schemaInfo.ObjectSchema.Name}] 的结构信息..."); await Task.Run(() => { SchemaAssistor.CompleteSchema(this.CurrentSchemaProvider, schemaInfo); }); this.ShowTipInformation(); }
private void RaiseExportProgressChanged(Int32 total, Int32 current, SchemaInfoTuple schema) { SchemaExportEventArgs args = new SchemaExportEventArgs(); args.Total = total; args.Current = current; args.SchemaInfo = schema; ThreadPool.QueueUserWorkItem((s) => { this.ExportProgressChanged?.Invoke(this, args); }); }
public void WriteSchemaInfo(ISheet formatSheet, ISheet sheet, EPoint start, SchemaInfoTuple schemaInfo) { //复制表头 formatSheet.CopyRow(ExcelTemplateFormat.TSTHeadRowNum, sheet, start.X, start.Y); //写入 表名(说明) 信息 String name = schemaInfo.ObjectSchema.Name; if (!String.IsNullOrEmpty(schemaInfo.ObjectSchema.Explain)) { name += $"({schemaInfo.ObjectSchema.Explain})"; } sheet.SetCellValue(start.X, 0, name); start.X += ExcelTemplateFormat.RowSpan; //复制列头 formatSheet.CopyRow(ExcelTemplateFormat.TSTColumnHeaderRowNum, sheet, start.X, start.Y); start.X += ExcelTemplateFormat.RowSpan; //开始写入列信息 Int32 num = 1; if (schemaInfo.ColumnSchemas == null || schemaInfo.ColumnSchemas.Count == 0) { return; } foreach (var colSchema in schemaInfo.ColumnSchemas) { //复制行 formatSheet.CopyRow(ExcelTemplateFormat.TSTRowTemlateNum, sheet, start.X, start.Y); Int32 col = 0; //写入序号 sheet.SetCellValue(start.X, col, num++); col += ExcelTemplateFormat.TableNumColLength; //写入列名 sheet.SetCellValue(start.X, col, colSchema.Name); col += ExcelTemplateFormat.TableFieldNameColLength; //写入注释 sheet.SetCellValue(start.X, col, colSchema.Explain); col += ExcelTemplateFormat.TableExplainColLength; //写入类型 sheet.SetCellValue(start.X, col, colSchema.DbTypeString); col += ExcelTemplateFormat.TableTypeColLength; //写入长度 if (colSchema.Length.HasValue) { sheet.SetCellValue(start.X, col, colSchema.Length.Value); } col += ExcelTemplateFormat.TableLengthColLength; //写入主键信息 if (colSchema.IsPrimaryKey) { sheet.SetCellValue(start.X, col, colSchema.IsPrimaryKey); } col += ExcelTemplateFormat.TableIsPrimaryColLength; //写入可空信息 if (!colSchema.IsNullable) { sheet.SetCellValue(start.X, col, colSchema.IsNullable); } col += ExcelTemplateFormat.TableIsNullableColLength; start.X += ExcelTemplateFormat.RowSpan; } }
/// <summary> /// 比较两个结构信息集合,并返回之间的差异(包含相同的信息项) /// </summary> /// <remarks>两个集合中的信息的 <see cref="SchemaInfoTuple.SchemaType"/> 值需要相同 </remarks> /// <param name="sourceSchemas"></param> /// <param name="targetSchemas"></param> /// <returns></returns> public static List <SchemaDifferenceInfo> CompareSchemaInfo(IEnumerable <SchemaInfoTuple> sourceSchemas, IEnumerable <SchemaInfoTuple> targetSchemas) { List <SchemaDifferenceInfo> differenceInfos = new List <SchemaDifferenceInfo>(); //层1:表、视图、函数、存储过程 //层2:列、索引 //比较层1 var sourceTopSchemas = sourceSchemas.Select(t => t.ObjectSchema).ToList(); var targetTopSchemas = targetSchemas.Select(t => t.ObjectSchema).ToList(); var topSchemaDifferenceInfos = CompareObjectSchemas(sourceTopSchemas, targetTopSchemas, out var topChangeFlag); var topSchemaDifferenceTypeTable = topSchemaDifferenceInfos.ToDictionary(t => t.Schema); differenceInfos.AddRange(topSchemaDifferenceInfos); Dictionary <String, SchemaInfoTuple> targetSchemaInfoTable = new Dictionary <String, SchemaInfoTuple>(); foreach (var schema in targetSchemas) { targetSchemaInfoTable.Add(schema.ObjectSchema.Name, schema); } //比较层2 foreach (var sourceSchema in sourceSchemas) { SchemaInfoTuple targetSchema = null; if (targetSchemaInfoTable.ContainsKey(sourceSchema.ObjectSchema.Name)) { targetSchema = targetSchemaInfoTable[sourceSchema.ObjectSchema.Name]; } switch (sourceSchema.SchemaType) { case SchemaType.Table: { //比较列 var columnDifferenceInfos = SchemaAssistor.CompareObjectSchemas( sourceSchema.ColumnSchemas.Cast <IObjectSchema>(), targetSchema?.ColumnSchemas.Cast <IObjectSchema>(), out var changeFlag); differenceInfos.AddRange(columnDifferenceInfos); //将变化中删除的列添加至目标结构中 var deletedColumnSchemas = columnDifferenceInfos.Where(t => t.DifferenceType == SchemaDifferenceType.Delete).Select(t => t.Schema).Cast <ColumnSchemaExtend>(); targetSchema?.ColumnSchemas.AddRange(deletedColumnSchemas); //如果第二层的信息发生了变化,则信息所属的父结点也应该被标记为变化 //改变可能是删除、新增、修改。当改变是新增与修改时,表中一定会存在 if (changeFlag) { if (topSchemaDifferenceTypeTable[targetSchema.ObjectSchema].DifferenceType != SchemaDifferenceType.Delete) { topSchemaDifferenceTypeTable[targetSchema.ObjectSchema].DifferenceType = SchemaDifferenceType.Modify; } } //比较索引 var indexDifferenceInfos = SchemaAssistor.CompareObjectSchemas( sourceSchema.IndexColumnSchemas.Cast <IObjectSchema>(), targetSchema?.IndexColumnSchemas.Cast <IObjectSchema>(), out changeFlag); differenceInfos.AddRange(indexDifferenceInfos); //将变化中删除的索引添加至目标结构中 var deletedIndexColumnSchemas = indexDifferenceInfos.Where(t => t.DifferenceType == SchemaDifferenceType.Delete).Select(t => t.Schema).Cast <IndexSchema>(); targetSchema?.IndexColumnSchemas.AddRange(deletedIndexColumnSchemas); //如果第二层的信息发生了变化 if (changeFlag) { if (topSchemaDifferenceTypeTable[targetSchema.ObjectSchema].DifferenceType != SchemaDifferenceType.Delete) { topSchemaDifferenceTypeTable[targetSchema.ObjectSchema].DifferenceType = SchemaDifferenceType.Modify; } } } break; case SchemaType.View: { //比较列 var columnDifferenceInfos = SchemaAssistor.CompareObjectSchemas( sourceSchema.ColumnSchemas.Cast <IObjectSchema>(), targetSchema?.ColumnSchemas.Cast <IObjectSchema>(), out var changeFlag); differenceInfos.AddRange(columnDifferenceInfos); //将变化中删除的列添加至目标结构中 var deletedIndexColumnSchemas = columnDifferenceInfos.Where(t => t.DifferenceType == SchemaDifferenceType.Delete).Select(t => t.Schema).Cast <ColumnSchemaExtend>(); targetSchema?.ColumnSchemas.AddRange(deletedIndexColumnSchemas); //如果第二层的信息发生了变化 if (changeFlag) { if (topSchemaDifferenceTypeTable[targetSchema.ObjectSchema].DifferenceType != SchemaDifferenceType.Delete) { topSchemaDifferenceTypeTable[targetSchema.ObjectSchema].DifferenceType = SchemaDifferenceType.Modify; } } } break; case SchemaType.Procedure: { } break; case SchemaType.Function: { } break; } } //获取新增的结构信息,上面的遍历是以源结构为集合的,所以目标结构新增的信息是遍历不到的 var addSchemaInfos = topSchemaDifferenceInfos.Where(t => t.DifferenceType == SchemaDifferenceType.Add); foreach (var addSchema in addSchemaInfos) { var targetSchema = targetSchemaInfoTable[addSchema.Schema.Name]; switch (targetSchema.SchemaType) { case SchemaType.Table: { //新增列 var columnDifferenceInfos = SchemaAssistor.CompareObjectSchemas( null, targetSchema?.ColumnSchemas.Cast <IObjectSchema>(), out var changeFlag); differenceInfos.AddRange(columnDifferenceInfos); //新增索引 var indexDifferenceInfos = SchemaAssistor.CompareObjectSchemas( null, targetSchema?.IndexColumnSchemas.Cast <IObjectSchema>(), out changeFlag); differenceInfos.AddRange(indexDifferenceInfos); } break; case SchemaType.View: { //新增列 var columnDifferenceInfos = SchemaAssistor.CompareObjectSchemas( null, targetSchema?.ColumnSchemas.Cast <IObjectSchema>(), out var changeFlag); differenceInfos.AddRange(columnDifferenceInfos); } break; case SchemaType.Procedure: { // } break; case SchemaType.Function: { // } break; } } return(differenceInfos); }
/// <summary> /// 是否需要补全结构信息 /// </summary> /// <param name="schemaInfo"></param> /// <returns></returns> public static Boolean IsRequiredCompleteSchema(SchemaInfoTuple schemaInfo) { return((schemaInfo.SchemaType == SchemaType.Table || schemaInfo.SchemaType == SchemaType.View) && schemaInfo.ColumnSchemas == null); }