Windows Forms 응용 프로그램에서 SMO를 사용하여 SQL Server 데이터베이스를 복원하려고합니다. 내 양식에는 Button (button1)과 TextBox (textBox1)가 있습니다. 이 버튼을 클릭하면 SQL Server 인스턴스가 시작되었는지 확인하는 함수가 호출됩니다. 시작되지 않은 경우 인스턴스를 시작하고 복원을 수행합니다. 이것은 작동하지만 함수가 실행되는 동안 폼이 응답하지 않습니다.데이터베이스를 복원하는 동안 응답이 없습니다.
using System;
using System.Windows.Forms;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Smo.Wmi;
namespace WindowsFormsApplication7
{
delegate void RestoreDatabaseDelegate();
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
BeginInvoke(
new RestoreDatabaseDelegate(RestoreDatabase));
}
private void RestoreDatabase()
{
//textBox1.Text = "";
try
{
Restore dbRestore = new Restore();
dbRestore.Database = "Sandbox";
dbRestore.Devices.Add(
new BackupDeviceItem(
@"C:\scripts\sandbox.bak", DeviceType.File));
Service service =
new ManagedComputer().Services["MSSQL$SQLEXPRESS2008"];
if (service.ServiceState == ServiceState.Stopped)
{
service.Start();
}
ServerConnection connection =
new ServerConnection(@"TEST\SQLEXPRESS2008");
connection.LoginSecure = true;
Server server = new Server(connection);
Database db = server.Databases[dbRestore.Database];
dbRestore.ReplaceDatabase = true;
dbRestore.Complete +=
new ServerMessageEventHandler(RestoreComplete);
dbRestore.Information +=
new ServerMessageEventHandler(RestoreInformation);
dbRestore.SqlRestoreAsync(server);
}
catch (Exception ex)
{
/*textBox1.Text +=
(ex.Message + Environment.NewLine);*/
}
}
private void RestoreComplete(
object sender, ServerMessageEventArgs e)
{
/*textBox1.Text +=
(e.Error.Message + Environment.NewLine);*/
}
private void RestoreInformation(
object sender, ServerMessageEventArgs e)
{
/*textBox1.Text +=
(e.Error.Message + Environment.NewLine);*/
}
}
}
(및 SQL Server 인스턴스 시작) 진행을 복원하면서 반응 형태를 유지하는 방법이 : 여기 내 코드는? 내가 도대체 뭘 잘못하고있는 겁니까?
나는 복원 작업 비동기 http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.restore.sqlrestoreasync.aspx –
SqlRestoreAsync를 사용하여 그렇게 생각 하지만 블록이 너무 비동기 적이지는 않습니다 .-)하지만 더 심각하게 보면 SqlRestoreAsync가 차단하지 않아도 블록 (예 : 서비스 시작)의 다른 부분이있을 수 있습니다. –
@Jani 수행 그가 SqlRestoreAsync –