我正在进行从/向Microsoft SQL Server恢复/备份数据库的应用程序。
如何实现捕获源文件夹中所有.bak文件的效果,而目标数据库的文本框是否作为新数据库的新名称并将其还原到sql server?
我的验证是,如果目标数据库组框中的名称,它将提示错误而不是恢复它。
这是我的代码
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;
}
按钮CLick
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(string SQLServer,string outputFolder) {
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);
//}
}
}
错误说:
“无法打开备份设备'D:\ TestBackup \ VSM642SP2QC__VfsWorkflow.bak'。?&gt;操作系统错误2(系统找不到指定的文件&gt;。)。\ r \ n \ nRESTORE FILELIST正在异常终止。”< / p>
我该怎么办?
答案 0 :(得分:2)
在您使用ReadFileList
destination.Devices.Add(source);
在调用DeviceType
方法之前,还原实例必须声明ReadFileList
。否则,将抛出异常。您声明了DeviceType
,但从未将其与Restore
联系起来。