using DBMigration.Models; using DBMigration.Services; using Microsoft.Data.SqlClient; namespace DBMigration.Forms { public partial class ProgressForm : Form { private readonly List _objects; private readonly ConnectionInfo _source; private readonly ConnectionInfo _target; private readonly MigrationService _migrationService; public ProgressForm(List objects, ConnectionInfo source, ConnectionInfo target) { InitializeComponent(); _objects = objects; _source = source; _target = target; _migrationService = new MigrationService(); progressBar.Maximum = _objects.Count; } private async void ProgressForm_Load(object sender, EventArgs e) { await Task.Run(() => MigrateObjects()); } private void MigrateObjects() { foreach (var obj in _objects) { try { UpdateProgress($"마이그레이션 시작: {obj.Type} {obj.Schema}.{obj.Name}"); if (obj.Type == "TABLE") { _migrationService.MigrateTable(obj, _source, _target); } else { // 뷰나 프로시저의 경우 스크립트만 실행 ExecuteScript(obj.Definition, _target); } UpdateProgress($"완료: {obj.Type} {obj.Schema}.{obj.Name}"); UpdateProgressBar(); } catch (Exception ex) { UpdateProgress($"오류 발생: {obj.Type} {obj.Schema}.{obj.Name}"); UpdateProgress($"에러 메시지: {ex.Message}"); if (MessageBox.Show( $"{obj.Type} {obj.Schema}.{obj.Name} 마이그레이션 중 오류가 발생했습니다.\n계속 진행하시겠습니까?", "오류", MessageBoxButtons.YesNo, MessageBoxIcon.Error) == DialogResult.No) { break; } } } MessageBox.Show("마이그레이션이 완료되었습니다.", "완료", MessageBoxButtons.OK, MessageBoxIcon.Information); DialogResult = DialogResult.OK; } private void UpdateProgress(string message) { if (InvokeRequired) { Invoke(new Action(UpdateProgress), message); return; } logTextBox.AppendText(message + Environment.NewLine); logTextBox.SelectionStart = logTextBox.TextLength; logTextBox.ScrollToCaret(); } private void UpdateProgressBar() { if (InvokeRequired) { Invoke(new Action(UpdateProgressBar)); return; } progressBar.Value++; } private void ExecuteScript(string script, ConnectionInfo connection) { using (var conn = new SqlConnection(connection.GetConnectionString())) { conn.Open(); using (var cmd = new SqlCommand(script, conn)) { cmd.ExecuteNonQuery(); } } } } }