【发布时间】:2010-12-11 19:12:13
【问题描述】:
我正在尝试在 Windows 窗体应用程序中使用 SMO 来恢复 SQL Server 数据库。我的表单有一个按钮 (button1) 和一个文本框 (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 实例启动)正在进行时保持表单响应?我做错了什么?
【问题讨论】:
标签: c# sql-server winforms smo