以编程方式恢复多个数据库
Restore multiple databases programmatically
我正在做 restoring/backup 数据库 from/to Microsoft SQL 服务器的应用程序。
如何实现捕获源文件夹中所有.bak文件的效果,而目标数据库的文本框作为新数据库的新名称并将其恢复到sql服务器?
我的验证是,如果目标数据库组框中的名称,它会提示错误而不是恢复它。
这是界面
这是我的代码
CheckDBExist
public List<string> CheckIfDatabaseExists(string SQLServer, string backupRestore)
{
bool result = false;
List<string> DBList = new List<string>();
string sqlConnectionString = this.rbWindow.Checked ?
"Server=" + this.cboSQLServer.Text.Trim() + ";Database=master;Trusted_Connection=Yes" :
"Server=" + this.cboSQLServer.Text.Trim() + ";Database=master;uid=" + this.txtUsername.Text.Trim() + ";pwd=" + this.txtPassword.Text.Trim();
foreach (Control c in groupBox1.Controls)
{
if (c.GetType() == typeof(TextBox))
{
SqlConnection tmpConn = new SqlConnection(sqlConnectionString);
string sqlCreateDBQuery = string.Format("SELECT database_id FROM sys.databases WHERE Name = '{0}'", c.Text);
using (tmpConn)
{
using (SqlCommand sqlCmd = new SqlCommand(sqlCreateDBQuery, tmpConn))
{
tmpConn.Open();
object resultObj = sqlCmd.ExecuteScalar();
int databaseID = 0;
if (resultObj != null)
{
int.TryParse(resultObj.ToString(), out databaseID);
}
tmpConn.Close();
result = (databaseID > 0);
if ((!result) && (backupRestore == "backup"))
{
DBList.Add("[" + c.Text + "]");
}
else if ((result) && (backupRestore == "restore"))
{
DBList.Add("[" + c.Text + "]");
}
}
}
}
}
return DBList;
}
单击按钮
private void btnRestore_Click(object sender, EventArgs e)
{
string outputFolder = this.txtFolder.Text;
if (string.IsNullOrEmpty(outputFolder))
{
MessageBox.Show("Please select source folder!", "Empty Source Folder", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
List<string> ExistDB = new List<string>();
ExistDB = this.CheckIfDatabaseExists(this.cboSQLServer.Text, "restore");
if (ExistDB.Count == 0)
{
RestoreDatabase(this.cboSQLServer.Text, this.txtFolder.Text);
}
else
{
MessageBox.Show("Databases " + string.Join(", ", ExistDB) + " exist!", "Database Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
恢复数据库代码
public void RestoreDatabase(字符串 SQL服务器,字符串输出文件夹)
{
ServerConnection con = new ServerConnection(SQLServer);
Server server = new Server(con);
foreach (Control c in groupBox3.Controls)
{
//try
//{
if (c.GetType() == typeof(TextBox))
{
Restore destination = new Restore();
destination.Action = RestoreActionType.Database;
destination.Database = c.Text;
string backUpFile = outputFolder + "\" + destination.Database + ".bak";
BackupDeviceItem source = new BackupDeviceItem(backUpFile, DeviceType.File);
string logFile = Path.GetDirectoryName(backUpFile);
logFile = Path.Combine(logFile, destination.Database + "_Log.ldf");
string dataFile = Path.GetDirectoryName(backUpFile);
dataFile = Path.Combine(dataFile, destination.Database + ".mdf");
destination.Devices.Add(source);
DataTable logicalRestoreFiles = destination.ReadFileList(server);
destination.RelocateFiles.Add(new RelocateFile(logicalRestoreFiles.Rows[0][0].ToString(), dataFile));
destination.RelocateFiles.Add(new RelocateFile(logicalRestoreFiles.Rows[1][0].ToString(), logFile));
destination.ReplaceDatabase = true;
destination.SqlRestore(server);
}
//}
//catch (Exception ex)
//{
//MessageBox.Show(ex.Message);
//}
}
}
这是触发异常的代码
错误说:
"Cannot open backup device 'D:\TestBackup\VSM642SP2QC__VfsWorkflow.bak'. ?>Operating system error 2(The system cannot find the file >specified.).\r\nRESTORE FILELIST is terminating abnormally."
我该怎么办?
添加这行代码,紧接在您使用 ReadFileList
的行之前
destination.Devices.Add(source);
还原实例必须在调用 ReadFileList
方法之前声明一个 DeviceType
。否则,将抛出异常。您声明了 DeviceType
,但从未将其连接到您的 Restore
。
我正在做 restoring/backup 数据库 from/to Microsoft SQL 服务器的应用程序。
如何实现捕获源文件夹中所有.bak文件的效果,而目标数据库的文本框作为新数据库的新名称并将其恢复到sql服务器?
我的验证是,如果目标数据库组框中的名称,它会提示错误而不是恢复它。
这是界面
这是我的代码
CheckDBExist
public List<string> CheckIfDatabaseExists(string SQLServer, string backupRestore)
{
bool result = false;
List<string> DBList = new List<string>();
string sqlConnectionString = this.rbWindow.Checked ?
"Server=" + this.cboSQLServer.Text.Trim() + ";Database=master;Trusted_Connection=Yes" :
"Server=" + this.cboSQLServer.Text.Trim() + ";Database=master;uid=" + this.txtUsername.Text.Trim() + ";pwd=" + this.txtPassword.Text.Trim();
foreach (Control c in groupBox1.Controls)
{
if (c.GetType() == typeof(TextBox))
{
SqlConnection tmpConn = new SqlConnection(sqlConnectionString);
string sqlCreateDBQuery = string.Format("SELECT database_id FROM sys.databases WHERE Name = '{0}'", c.Text);
using (tmpConn)
{
using (SqlCommand sqlCmd = new SqlCommand(sqlCreateDBQuery, tmpConn))
{
tmpConn.Open();
object resultObj = sqlCmd.ExecuteScalar();
int databaseID = 0;
if (resultObj != null)
{
int.TryParse(resultObj.ToString(), out databaseID);
}
tmpConn.Close();
result = (databaseID > 0);
if ((!result) && (backupRestore == "backup"))
{
DBList.Add("[" + c.Text + "]");
}
else if ((result) && (backupRestore == "restore"))
{
DBList.Add("[" + c.Text + "]");
}
}
}
}
}
return DBList;
}
单击按钮
private void btnRestore_Click(object sender, EventArgs e)
{
string outputFolder = this.txtFolder.Text;
if (string.IsNullOrEmpty(outputFolder))
{
MessageBox.Show("Please select source folder!", "Empty Source Folder", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
List<string> ExistDB = new List<string>();
ExistDB = this.CheckIfDatabaseExists(this.cboSQLServer.Text, "restore");
if (ExistDB.Count == 0)
{
RestoreDatabase(this.cboSQLServer.Text, this.txtFolder.Text);
}
else
{
MessageBox.Show("Databases " + string.Join(", ", ExistDB) + " exist!", "Database Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
恢复数据库代码
public void RestoreDatabase(字符串 SQL服务器,字符串输出文件夹) {
ServerConnection con = new ServerConnection(SQLServer);
Server server = new Server(con);
foreach (Control c in groupBox3.Controls)
{
//try
//{
if (c.GetType() == typeof(TextBox))
{
Restore destination = new Restore();
destination.Action = RestoreActionType.Database;
destination.Database = c.Text;
string backUpFile = outputFolder + "\" + destination.Database + ".bak";
BackupDeviceItem source = new BackupDeviceItem(backUpFile, DeviceType.File);
string logFile = Path.GetDirectoryName(backUpFile);
logFile = Path.Combine(logFile, destination.Database + "_Log.ldf");
string dataFile = Path.GetDirectoryName(backUpFile);
dataFile = Path.Combine(dataFile, destination.Database + ".mdf");
destination.Devices.Add(source);
DataTable logicalRestoreFiles = destination.ReadFileList(server);
destination.RelocateFiles.Add(new RelocateFile(logicalRestoreFiles.Rows[0][0].ToString(), dataFile));
destination.RelocateFiles.Add(new RelocateFile(logicalRestoreFiles.Rows[1][0].ToString(), logFile));
destination.ReplaceDatabase = true;
destination.SqlRestore(server);
}
//}
//catch (Exception ex)
//{
//MessageBox.Show(ex.Message);
//}
}
}
这是触发异常的代码
错误说:
"Cannot open backup device 'D:\TestBackup\VSM642SP2QC__VfsWorkflow.bak'. ?>Operating system error 2(The system cannot find the file >specified.).\r\nRESTORE FILELIST is terminating abnormally."
我该怎么办?
添加这行代码,紧接在您使用 ReadFileList
destination.Devices.Add(source);
还原实例必须在调用 ReadFileList
方法之前声明一个 DeviceType
。否则,将抛出异常。您声明了 DeviceType
,但从未将其连接到您的 Restore
。