[성현모] TRA Recovery Tool 추가
This commit is contained in:
211
CPXV2 TRA JSON Recovery/SystemX.Product.CP.RecoveryTool/Form1.cs
Normal file
211
CPXV2 TRA JSON Recovery/SystemX.Product.CP.RecoveryTool/Form1.cs
Normal file
@ -0,0 +1,211 @@
|
||||
using DevExpress.Internal.WinApi.Windows.UI.Notifications;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Data.Common;
|
||||
using System.Data.SqlClient;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Security.Policy;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace SystemX.Product.CP.RecoveryTool
|
||||
{
|
||||
public partial class Form1 : Form
|
||||
{
|
||||
string mdfFile = string.Empty;
|
||||
string ldfFile = string.Empty;
|
||||
string recoveryName = string.Empty;
|
||||
|
||||
public Form1()
|
||||
{
|
||||
InitializeComponent();
|
||||
SelectDBList();
|
||||
lbAttachResult.Text = string.Empty;
|
||||
}
|
||||
|
||||
private void btnSelectDb_Click(object sender, EventArgs e)
|
||||
{
|
||||
mdfFile = string.Empty;
|
||||
ldfFile = string.Empty;
|
||||
recoveryName = string.Empty;
|
||||
textRecoveryName.Text = string.Empty;
|
||||
|
||||
using (OpenFileDialog dialog = new OpenFileDialog())
|
||||
{
|
||||
dialog.Filter = "*.mdf|*.mdf";
|
||||
if (dialog.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
mdfFile = dialog.FileName;
|
||||
|
||||
string ldfName = $"{Path.GetFileNameWithoutExtension(dialog.FileName)}_log.ldf";
|
||||
ldfFile = $@"{Path.GetDirectoryName(dialog.FileName)}\{ldfName}";
|
||||
}
|
||||
textMdf.Text = mdfFile; //mdf
|
||||
textLdf.Text = ldfFile; //ldf
|
||||
}
|
||||
}
|
||||
|
||||
private void btnAttach_Click(object sender, EventArgs e)
|
||||
{
|
||||
string error = "success";
|
||||
|
||||
if (File.Exists(mdfFile) == true)
|
||||
ledMdf.BackColor = Color.Lime;
|
||||
else
|
||||
{
|
||||
ledMdf.BackColor = Color.Red;
|
||||
error = "Invalid FIle";
|
||||
}
|
||||
|
||||
if (File.Exists(ldfFile) == true)
|
||||
ledLdf.BackColor = Color.Lime;
|
||||
else
|
||||
{
|
||||
ledLdf.BackColor = Color.Red;
|
||||
error = "Invalid FIle";
|
||||
}
|
||||
|
||||
recoveryName = textRecoveryName.Text;
|
||||
if (string.IsNullOrEmpty(recoveryName) == false)
|
||||
ledLdf.BackColor = Color.Lime;
|
||||
else
|
||||
{
|
||||
ledLdf.BackColor = Color.Red;
|
||||
error = "Invalid RecoveryName";
|
||||
}
|
||||
|
||||
lbAttachResult.Text = error;
|
||||
if (error == "success")
|
||||
{
|
||||
string attachError = Attach(mdfFile, ldfFile, recoveryName);
|
||||
if (string.IsNullOrEmpty(attachError) == false)
|
||||
{
|
||||
lbAttachResult.ForeColor = Color.Red;
|
||||
lbAttachResult.Text = attachError;
|
||||
}
|
||||
else
|
||||
lbAttachResult.ForeColor = Color.Lime;
|
||||
}
|
||||
else
|
||||
lbAttachResult.ForeColor = Color.Red;
|
||||
|
||||
SelectDBList();
|
||||
}
|
||||
|
||||
private string Attach(string mdfFile, string ldfFile, string attachName)
|
||||
{
|
||||
string error = string.Empty;
|
||||
|
||||
// 프로세스 설정
|
||||
string command = $" -S localhost -U alis -P Kefico!@34 -Q \"CREATE DATABASE {attachName} ON (FILENAME = '{mdfFile}'), (FILENAME = '{ldfFile}') FOR ATTACH;\"";
|
||||
Console.WriteLine(command);
|
||||
ProcessStartInfo startInfo = new ProcessStartInfo
|
||||
{
|
||||
FileName = $"sqlcmd", // cmd.exe로 명령어 실행
|
||||
Arguments = $"{command}", // /c는 명령어 실행 후 종료하는 옵션
|
||||
RedirectStandardOutput = true, // 표준 출력 리디렉션
|
||||
RedirectStandardError = true, // 표준 오류 리디렉션
|
||||
UseShellExecute = false, // 셸을 사용하지 않도록 설정
|
||||
CreateNoWindow = true // 새 창을 열지 않도록 설정,
|
||||
};
|
||||
|
||||
// 프로세스 실행
|
||||
using (Process process = Process.Start(startInfo))
|
||||
{
|
||||
if (process != null)
|
||||
{
|
||||
// 출력 결과를 읽기
|
||||
string output = process.StandardOutput.ReadToEnd();
|
||||
string response = process.StandardError.ReadToEnd();
|
||||
|
||||
Console.WriteLine(output);
|
||||
Console.WriteLine(response);
|
||||
|
||||
error = output;
|
||||
}
|
||||
}
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
private void Detach(string dbName)
|
||||
{
|
||||
// 프로세스 설정
|
||||
string command = $" -S localhost -U alis -P Kefico!@34 -Q \"ALTER DATABASE [{dbName}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; EXEC sp_detach_db '{dbName}';\"";
|
||||
Console.WriteLine(command);
|
||||
ProcessStartInfo startInfo = new ProcessStartInfo
|
||||
{
|
||||
FileName = $"sqlcmd", // cmd.exe로 명령어 실행
|
||||
Arguments = $"{command}", // /c는 명령어 실행 후 종료하는 옵션
|
||||
RedirectStandardOutput = true, // 표준 출력 리디렉션
|
||||
RedirectStandardError = true, // 표준 오류 리디렉션
|
||||
UseShellExecute = false, // 셸을 사용하지 않도록 설정
|
||||
CreateNoWindow = true // 새 창을 열지 않도록 설정,
|
||||
};
|
||||
|
||||
// 프로세스 실행
|
||||
using (Process process = Process.Start(startInfo))
|
||||
{
|
||||
if (process != null)
|
||||
{
|
||||
// 출력 결과를 읽기
|
||||
string output = process.StandardOutput.ReadToEnd();
|
||||
string response = process.StandardError.ReadToEnd();
|
||||
|
||||
Console.WriteLine(output);
|
||||
Console.WriteLine(response);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void SelectDBList()
|
||||
{
|
||||
//delay
|
||||
DateTime start = DateTime.Now;
|
||||
while(true)
|
||||
{
|
||||
if (DateTime.Now - start >= TimeSpan.FromMilliseconds(1000))
|
||||
break;
|
||||
Thread.Sleep(10);
|
||||
}
|
||||
|
||||
gridDB.Rows.Clear();
|
||||
|
||||
var connMain = new SqlConnection("server=127.0.0.1,1433;uid=alis;password=Kefico!@34;");
|
||||
connMain.Open();
|
||||
|
||||
SqlCommand SQLCmd = new SqlCommand("select name from sys.databases with(nolock) where owner_sid != 0x01;", connMain);
|
||||
SQLCmd.CommandType = CommandType.Text;
|
||||
DbDataReader dtReader = SQLCmd.ExecuteReader();
|
||||
|
||||
DataTable dtResult = new DataTable();
|
||||
dtResult.Load(dtReader);
|
||||
|
||||
List<string> list = dtResult?.AsEnumerable()?.Select(x => x.ItemArray?.First()?.ToString())?.ToList();
|
||||
|
||||
foreach(var db in list)
|
||||
{
|
||||
gridDB.Rows.Add(gridDB.Rows.Count + 1, db, "Remove");
|
||||
}
|
||||
}
|
||||
|
||||
private void gridDB_CellContentClick(object sender, DataGridViewCellEventArgs e)
|
||||
{
|
||||
//remove button
|
||||
if (e.ColumnIndex == 2)
|
||||
{
|
||||
var dbName = gridDB.Rows[e.RowIndex].Cells[1].Value.ToString();
|
||||
Detach(dbName);
|
||||
SelectDBList();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user