Ich versuche SMO in einer Windows Forms-Anwendung zu verwenden, um eine SQL Server-Datenbank wiederherzustellen. Mein Formular hat eine Schaltfläche (button1) und eine TextBox (textBox1). Wenn auf die Schaltfläche geklickt wird, wird eine Funktion aufgerufen, die überprüft, ob die SQL Server-Instanz gestartet wurde. Wenn es nicht gestartet wird, starte ich die Instanz und führe eine Wiederherstellung durch. Dies funktioniert, aber das Formular reagiert nicht, während die Funktion ausgeführt wird. Hier ist mein Code:Formular reagiert nicht beim Wiederherstellen der Datenbank
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);*/
}
}
}
Gibt es eine Möglichkeit, die Form, die auf zu halten, während wiederherstellen (und SQL Server-Instanz Start) ist im Gang? Was mache ich falsch?
Ich glaube, er so getan, indem Sie SqlRestoreAsync –
SqlRestoreAsync eine Operation Führt wiederherstellen asynchron http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.restore.sqlrestoreasync.aspx –
@Jani Es ist nicht sehr asynchron, ist es blockiert ;-) Aber im Ernst, es kann einen anderen Teil der Funktion (Dienst starten, zum Beispiel), die blockiert, auch wenn SqlRestoreAsync nicht. –