private static void Main(string[] args) { var dbSqlServer = new SqlServerDbProvider().GetDatabase(ConnectionString); var dbModel = new PostulateDbProvider().GetDatabase(@"C:\Users\Adam\Source\Repos\Hs5\Hs5.Models\bin\Debug\Hs5.Models.dll"); var diff = SchemaComparison.Execute(dbModel, dbSqlServer); Console.WriteLine("Create:"); foreach (var grp in diff.Create.GroupBy(row => row.GetType().Name)) { Console.WriteLine(grp.Key); foreach (var item in grp) { Console.WriteLine($"- {item}"); } } foreach (var cmd in diff.GetScriptCommands(new SqlServerSyntax())) { Console.WriteLine(cmd); Console.WriteLine("GO"); Console.WriteLine(); } Console.ReadLine(); }
/// <summary> /// 创建 SqlServer 数据库查询执行程序 /// </summary> /// <param name="dbProvider">数据库访问提供程序</param> public SqlDbExecutor(SqlServerDbProvider dbProvider) : base(dbProvider) { ConnectionString = dbProvider.ConnectionString; Configuration = dbProvider.ServiceProvider.GetService <SqlServerConfiguration>(); }
private static void Main(string[] args) { try { if ((args?.Length ?? 0) == 0) { Console.WriteLine("A folder name (usually a solution folder) is required to run this command."); return; } var assembly = Assembly.GetExecutingAssembly(); Console.WriteLine($"Postulate.Merge.SqlServer version {assembly.GetName().Version}"); const string settingsFilename = "Postulate.Merge.json"; string path = args[0]; string settingsFile = Path.Combine(path, settingsFilename); if (!File.Exists(settingsFile)) { CreateEmptySettingsFile(path, settingsFilename); return; } var settings = JsonFile.Load <Settings>(settingsFile); bool anyDiff = false; while (true) { Console.WriteLine($"Analyzing model classes in {Path.GetFileName(settings.SourceAssembly)}..."); var sourceDb = new PostulateDbProvider <SqlServerIntegrator>().GetDatabase(settings.SourceAssembly); string connectionString = ResolveConnectionString(settings, path); var targetProvider = new SqlServerDbProvider(); var connectionInfo = ConnectionStrings.Parse(connectionString); Console.WriteLine($"Analyzing target database {connectionInfo.TryGetValues("Data Source", "Database")}..."); var targetDb = targetProvider.GetDatabaseAsync(connectionString).Result; var syntax = targetProvider.GetDefaultSyntax(); Console.WriteLine("Looking for differences..."); Console.WriteLine(); var diff = SchemaComparison.Execute(sourceDb, targetDb, settings.ExcludeObjects); if (diff.AnyDifferences()) { anyDiff = true; StringBuilder script = new StringBuilder(); var commands = diff.GetScriptCommands(syntax); foreach (var cmd in commands) { script.AppendLine(cmd); } Console.WriteLine(script.ToString()); Console.WriteLine("Press Enter to execute, E to edit, T to save test case, or Escape to cancel:"); var response = Console.ReadKey(); switch (response.Key) { case ConsoleKey.Escape: return; case ConsoleKey.Enter: Console.WriteLine("Executing script..."); var scriptRunner = new SqlScriptRunner(targetProvider); scriptRunner.Run(connectionString, script.ToString()); break; case ConsoleKey.E: Console.WriteLine($"Starting {Path.GetFileName(settings.CommandExe)}..."); string scriptFile = Path.Combine(path, "Postulate.Merge.sql"); if (File.Exists(scriptFile)) { File.Delete(scriptFile); } diff.SaveScript(syntax, scriptFile); EditScript(scriptFile, settings, connectionString); return; case ConsoleKey.T: string testCaseFile = Path.Combine(path, "Postulate.TestCase.json"); if (File.Exists(testCaseFile)) { File.Delete(testCaseFile); } diff.SaveTestCase(testCaseFile); Console.WriteLine($"Test case file {testCaseFile} was created. If you raise an issue on the SchemaSync repository (https://github.com/adamosoftware/SchemaSync), please attach the test case if appropriate."); Console.ReadLine(); return; } } else { Console.WriteLine($"No {((anyDiff) ? "more " : string.Empty)}differences found."); Console.ReadLine(); break; } } } catch (Exception exc) { Console.WriteLine(exc.Message); Console.ReadLine(); } }
internal SqlServerTransactionContext(SqlServerDbProvider dbProvider) : base(dbProvider) { Connection = new SqlConnection(dbProvider.ConnectionString); }