ОК, я думаю, мне нужно прояснить что-то о моем сообщении, о котором я забыл упомянуть ранее. Мое «тестовое приложение» в Visual Studio 2010 имеет базу данных SQL Server 2008 R2 EXPRESS. Однако, база данных не с автономной установки SQL Server Express. Скорее, файл данных, т. Е. .mdf и .ldf, выбираются в VS «Project \ Add New Item \ Data \ Service-based Database». Таким образом, файл данных «BkUp_SMO.mdf».Как отправить команду резервного копирования или восстановления в окно команд
Я не уверен, что это имеет значение, но я попробовал несколько примеров использования объектов Microsoft.SqlServer.Management, SMO, но безуспешно. Я добавил необходимые .DLL, то есть Microsoft.SqlServer.ConnectionInfo, Microsoft.SqlServer.Management.Sdk.Sfc, Microsoft.SqlServer.Smo, Microsoft.SqlServer.SmoExtended.
В моем коде у меня есть «использование» операторов для Microsoft.SqlServer.Management.Common и Microsoft.SqlServer.Management.Smo. Я даже добавил «использование» для System.Deployment.Application, чтобы установить строковое значение для пути к папке развертывания ClickOnce, где находится DB и файл журнала, используя String dbPath = ApplicationDeployment.CurrentDeployment.DataDirectory;
В дополнение к статье ссылка ниже, я также попытался примеры из другой статьи, то есть, «Резервное копирование базы данных SQL в C#» Backing up an SQL Database in C#
Разве это не возможно выполнить резервное копирование и восстановление на визуал Студия создала базу данных SQL?
Я написал приложение для тестирования в C# с целью отправки команды резервного копирования или восстановления SQL Server с помощью командной строки. Я на основе некоторых из моего кода на статье под заголовком: Резервное копирование и восстановление базы данных SQL Server из командной строки
Backup and Restore Your SQL Server Database from the Command Line
Полное применение будет user_App, где я не хочу конечного пользователя нужно открыть окно команд и ввести что угодно, поэтому я пытаюсь отправить необходимые команды с помощью кода C#, как показано ниже. Моя проблема заключается в том, что код работает без исключения, окно CMD открывается и закрывается, но без какой-либо резервной копии моего файла данных SQL Server 2008 R2 (.mdf).
Пожалуйста, укажите, что мне не хватает в моем коде, или лучший способ выполнить это. Также будет ли полная резервная копия автоматически архивировать файл журнала (.ldf)?
First code attempt
private void btnChoose_Click(object sender, EventArgs e)
{
if (optBkupCMD.Checked)
{
StringBuilder bkup = new StringBuilder();
bkup.Append("SqlCmd -E -S ");
bkup.Append(Environment.MachineName);//servername appears to be same as computer name.
bkup.Append(" –Q “BACKUP DATABASE [BkUp_SMO.mdf] TO DISK=’C:\\Backups\\BkUp_SMO.bak'”");
string theBackup = bkup.ToString();
using (Process process = new Process())
{
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.CreateNoWindow = false;
process.StartInfo.UseShellExecute = false;
process.StartInfo.Arguments = @"/C";
process.Start();
process.StandardInput.WriteLine(theBackup);
process.StandardInput.Flush();
process.StandardInput.Close();
process.WaitForExit();
Console.WriteLine(process.StandardOutput.ReadToEnd());
}
else if (optRestoreCMD.Checked)
{
StringBuilder rstr = new StringBuilder();
rstr.Append("SqlCmd -E -S ");
rstr.Append(Environment.MachineName);
rstr.Append(" –Q “RESTORE DATABASE [BkUp_SMO.mdf] FROM DISK=’C:\\Backups\\BkUp_SMO.bak'”");
string restore = rstr.ToString();
using (Process process = new Process())
{
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.CreateNoWindow = false;
process.StartInfo.UseShellExecute = false;
process.StartInfo.Arguments = @"/C";
process.Start();
process.StandardInput.WriteLine(restore);
process.StandardInput.Flush();
process.StandardInput.Close();
process.WaitForExit();
Console.WriteLine(process.StandardOutput.ReadToEnd());
}
}
}
My 2nd code attempt.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using Microsoft.Win32;
using System.Deployment.Application;
using System.Diagnostics;
using System.IO;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;
namespace DB_Bkup_using_SMO
{
public partial class Bkup_in_CSharp : Form
{
public Bkup_in_CSharp()
{
InitializeComponent();
}
private void btnBkViaCsharp_Click(object sender, EventArgs e)
{
string filePath = ApplicationDeployment.CurrentDeployment.DataDirectory;
BackupDatabase(filePath);
}
private void btnRestViaCsharp_Click(object sender, EventArgs e)
{
string filePath = ApplicationDeployment.CurrentDeployment.DataDirectory;
RestoreDatabase(filePath);
}
///<summary>
///Backup a whole database to the specified file.
///</summary>
///<remarks>
///The database must not be in use when backing up.
///The folder holding the file must have appropriate permissions given
///</remarks>
///<param name="backupFile">Full path to file to hold the backup</param>
public static void BackupDatabase(string backupFile)
{
try
{
ServerConnection con = new ServerConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\BkUp_SMO.mdf;Integrated Security=True;User Instance=True");
Server server = new Server(con);
Backup source = new Backup();
source.Database = "BkUp_SMO.mdf";
source.Action = BackupActionType.Database;
source.LogTruncation = BackupTruncateLogType.Truncate;
BackupDeviceItem destination = new BackupDeviceItem(backupFile, DeviceType.File);
source.Devices.Add(destination);
source.SqlBackup(server);
con.Disconnect();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + " " + ex.InnerException);
}
}
///<summary>
///Restore a whole database from a backup file.
///</summary>
///<remarks>
///The database must be in use when backing up.
///The folder holding the file must have appropriate permissions given.
///</remarks>
///<param name="backupFile">Full path to file to holding the backup</param>
public static void RestoreDatabase(string backupFile)
{
try
{
ServerConnection con = new ServerConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\BkUp_SMO.mdf;Integrated Security=True;User Instance=True");
Server server = new Server(con);
Restore destination = new Restore();
destination.Database = "BkUp_SMO.mdf";
destination.Action = RestoreActionType.Database;
destination.Action = RestoreActionType.Log;
BackupDeviceItem source = new BackupDeviceItem(backupFile, DeviceType.File);
destination.Devices.Add(source);
destination.ReplaceDatabase = true;
destination.SqlRestore(server);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + " " + ex.InnerException);
}
}
}
}
Вам нужно «показать» черную линию командной строки? Если нет, есть простой способ резервного копирования, как и мой. –
Hello Kay Lee. Нет, мне не нужно видеть окно команд. Однако он должен предоставить конечному пользователю возможность легко выполнить резервное копирование. Пожалуйста, поделитесь своим методом или образцом кода. – CodeMann