C# 如何将备份或还原命令发送到命令窗口

C# 如何将备份或还原命令发送到命令窗口,c#,sql-server-2008,command-line-interface,C#,Sql Server 2008,Command Line Interface,好的,我想我需要澄清一些我之前忘记提到的关于我的帖子的事情。我在Visual Studio 2010中的“测试应用程序”有一个SQL Server 2008 R2EXPRESS数据库。但是,该数据库并非来自独立的SQL Server Express安装。相反,数据文件,即.mdf和.ldf是从VS“Project\Add New Item\data\Service based Database”中选择的。因此,我的“BkUp_SMO.mdf”数据文件 我不确定上述内容是否会产生影响,但我尝试了多

好的,我想我需要澄清一些我之前忘记提到的关于我的帖子的事情。我在Visual Studio 2010中的“测试应用程序”有一个SQL Server 2008 R2EXPRESS数据库。但是,该数据库并非来自独立的SQL Server Express安装。相反,数据文件,即.mdf和.ldf是从VS“Project\Add New Item\data\Service based Database”中选择的。因此,我的“BkUp_SMO.mdf”数据文件

我不确定上述内容是否会产生影响,但我尝试了多个使用Microsoft.SqlServer.Management objects、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添加了一个“using”,以便使用字符串dbPath=ApplicationDeployment.CurrentDeployment.DataDirectory为返回数据库和日志文件所在的ClickOnce部署文件夹的路径设置一个字符串值

除了下面引用的文章外,我还尝试了另一篇文章中的示例,即“用C#备份SQL数据库”

是否无法在Visual Studio创建的SQL数据库上执行备份和恢复

我用C#编写了一个测试应用程序,目的是通过命令行发送SQL Server备份或还原命令。我的一些代码基于一篇题为“从命令行备份和恢复SQL Server数据库”的文章

完整的应用程序将是一个用户应用程序,我不希望最终用户必须打开命令窗口并键入任何内容,因此我尝试通过C代码发送所需的命令,如下所示。我的问题是,代码运行时没有异常,CMD窗口打开和关闭,但没有对SQL Server 2008 R2数据文件(.mdf)进行任何备份

请建议我的代码中缺少什么,或者用更好的方法来完成这一点。 此外,完整备份是否也会自动备份日志文件(.ldf)

}

我的第二次代码尝试。
使用制度;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用System.Data.SqlClient;
使用系统图;
使用System.Linq;
使用系统文本;
使用System.Windows.Forms;
使用系统线程;
使用Microsoft.Win32;
使用System.Deployment.Application;
使用系统诊断;
使用System.IO;
使用Microsoft.SqlServer.Management.Smo;
使用Microsoft.SqlServer.Management.Common;
命名空间DB_Bkup_使用_SMO
{
公共部分类Bkup_in_CSharp:Form
{
公共Bkup_in_CSharp()
{
初始化组件();
}
私有无效btnBkViaCsharp\u单击(对象发送者,事件参数e)
{
字符串filePath=ApplicationDeployment.CurrentDeployment.DataDirectory;
BackUpdatebase(文件路径);
}
私有void btnrestviacharp\u单击(对象发送者,事件参数e)
{
字符串filePath=ApplicationDeployment.CurrentDeployment.DataDirectory;
恢复数据库(文件路径);
}
///
///将整个数据库备份到指定的文件。
///
///
///备份时不得使用数据库。
///保存文件的文件夹必须具有相应的权限
///
///保存备份的文件的完整路径
公共静态void backupdatebase(字符串backupFile)
{
尝试
{
ServerConnection con=newserverconnection(@“数据源=。\SQLEXPRESS;AttachDbFilename=|数据目录| \BkUp_SMO.mdf;集成安全性=真;用户实例=真”);
服务器=新服务器(con);
备份源=新备份();
source.Database=“BkUp\u SMO.mdf”;
source.Action=BackupActionType.Database;
source.LogTruncation=BackupTruncateLogType.Truncate;
BackupDeviceItem destination=新的BackupDeviceItem(backupFile,DeviceType.File);
source.Devices.Add(目的地);
SqlBackup(服务器);
con.Disconnect();
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message+“”+ex.InnerException);
}
}
///
///从备份文件还原整个数据库。
///
///
///备份时必须使用数据库。
///保存文件的文件夹必须具有相应的权限。
///
///保存备份的文件的完整路径
公共静态void RestoreDatabase(字符串备份文件)
{
尝试
{
ServerConnection con=newserverconnection(@“数据源=。\SQLEXPRESS;AttachDbFilename=|数据目录| \BkUp_SMO.mdf;集成安全性=真;用户实例=真”);
服务器=新服务器(con);
还原目标=新还原();
destination.Database=“BkUp\u SMO.mdf”;
destination.Action=RestoreActionType.Database;
destination.Action=RestoreActionType.Log;
BackupDeviceItem source=新的BackupDeviceItem(backupFile,DeviceType.File);
destination.Devices.Add(源);
destination.ReplaceDatabase=true;
destination.SqlRestore(服务器);
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message+“”+ex.InnerException);
}
}
}
}

这是我备份SQL Server 2008 R2的代码

如果您尝试搜索,这种基本示例代码在很多地方都有

试一下,但没必要把它作为一个答案,因为这里有很多

string masterdb_ConnectionString = string.Format(@"Data Source={0};Initial Catalog=Master;Connect Timeout=79;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False;Integrated Security=True;", System.Environment.MachineName);

using (SqlConnection masterdbConn = new SqlConnection())
{
    masterdbConn.ConnectionString = mastedb_rConnectionString;
    masterdbConn.Open();

    using (SqlCommand multiuser_rollback_dbcomm = new SqlCommand())
    {
        multiuser_rollback_dbcomm.Connection = masterdbConn;
        multiuser_rollback_dbcomm.CommandText= @"ALTER DATABASE yourdbname SET MULTI_USER WITH ROLLBACK IMMEDIATE";
        multiuser_rollback_dbcomm.CommandTimeout = 79;

        multiuser_rollback_dbcomm.ExecuteNonQuery();
    }
    masterdbConn.Close();
}

SqlConnection.ClearAllPools();

string yourdb_ConnectionString= "connectionstring for yourdb here";

using (SqlConnection backupConn = new SqlConnection())
{
    backupConn.ConnectionString = yourdb_ConnectionString;
    backupConn.Open();

    using (SqlCommand backupcomm = new SqlCommand())
    {
        backupcomm.Connection = backupConn;
        backupcomm.CommandText = string.Format(@"BACKUP DATABASE yourdbname TO DISK='c:\yourdbname.bak'", DateTime.Today.ToString("yyyy/MM/dd"));
        backupcomm.CommandTimeout = 79;

        backupcomm.ExecuteNonQuery();
    }
    backupConn.Close();
}
更新- 客户端(用户)计算机上是否会安装SQL Server 2008 R2

您已经在使用“Integrated Security=True”,这意味着使用此connectionstring的用户将拥有作为管理员的所有(完全)权限
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);
        }

    }
}
}
string masterdb_ConnectionString = string.Format(@"Data Source={0};Initial Catalog=Master;Connect Timeout=79;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False;Integrated Security=True;", System.Environment.MachineName);

using (SqlConnection masterdbConn = new SqlConnection())
{
    masterdbConn.ConnectionString = mastedb_rConnectionString;
    masterdbConn.Open();

    using (SqlCommand multiuser_rollback_dbcomm = new SqlCommand())
    {
        multiuser_rollback_dbcomm.Connection = masterdbConn;
        multiuser_rollback_dbcomm.CommandText= @"ALTER DATABASE yourdbname SET MULTI_USER WITH ROLLBACK IMMEDIATE";
        multiuser_rollback_dbcomm.CommandTimeout = 79;

        multiuser_rollback_dbcomm.ExecuteNonQuery();
    }
    masterdbConn.Close();
}

SqlConnection.ClearAllPools();

string yourdb_ConnectionString= "connectionstring for yourdb here";

using (SqlConnection backupConn = new SqlConnection())
{
    backupConn.ConnectionString = yourdb_ConnectionString;
    backupConn.Open();

    using (SqlCommand backupcomm = new SqlCommand())
    {
        backupcomm.Connection = backupConn;
        backupcomm.CommandText = string.Format(@"BACKUP DATABASE yourdbname TO DISK='c:\yourdbname.bak'", DateTime.Today.ToString("yyyy/MM/dd"));
        backupcomm.CommandTimeout = 79;

        backupcomm.ExecuteNonQuery();
    }
    backupConn.Close();
}