Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何以编程方式备份SQL Server 2014 Express Localdb(.mdf)文件_C#_Sql Server_Sql Server 2014 Localdb - Fatal编程技术网

C# 如何以编程方式备份SQL Server 2014 Express Localdb(.mdf)文件

C# 如何以编程方式备份SQL Server 2014 Express Localdb(.mdf)文件,c#,sql-server,sql-server-2014-localdb,C#,Sql Server,Sql Server 2014 Localdb,我有一个简单的Windows应用程序,它使用SQL Server 2014 LocalDB(.mdf文件) 我希望每当用户单击“退出”按钮时,我的应用程序都会自动将其localdb文件(.mdf)备份到同一台用户计算机中的另一个文件夹中 我编写了以下简单代码,但出现了SQLException语法错误: “C:\greendb\u angelheart.mdf”附近的语法不正确 (数据库“{0}”语法似乎很好) 我担心使用普通的SqlConnection代码连接到特定的localdb文件是否正确

我有一个简单的Windows应用程序,它使用SQL Server 2014 LocalDB(
.mdf
文件)

我希望每当用户单击“退出”按钮时,我的应用程序都会自动将其localdb文件(
.mdf
)备份到同一台用户计算机中的另一个文件夹中

我编写了以下简单代码,但出现了SQLException语法错误:

“C:\greendb\u angelheart.mdf”附近的语法不正确

数据库“{0}”
语法似乎很好)

我担心使用普通的
SqlConnection
代码连接到特定的
localdb
文件是否正确

我的简单代码是:

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
    if (MessageBox.Show("Really want to exit? Thank you !", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.No)
    {
            e.Cancel = true;
    }
    else
    {
            string backuppath_basic = @"c:\Green_Backup";

            if (!System.IO.Directory.Exists("backuppath_basic"))
            {
                System.IO.Directory.CreateDirectory(backuppath_basic);
            }

            var greendbfileName = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), string.Format("greendb_{0}.mdf", personID));
            var copied_greendbfileName = string.Format(@"C:\greendb_{0}.mdf", personID);

            string localConnectionString = string.Format(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename= " + Environment.GetEnvironmentVariable("APPDATA") + @"\greendb_{0}.mdf;Integrated Security=True;Connect Timeout=30;", personID);

            SqlConnection backupConn = new SqlConnection();
            backupConn.ConnectionString = localConnectionString;
            backupConn.Open();

            SqlCommand backupcomm = backupConn.CreateCommand();
            string backupdb = @"BACKUP DATABASE ""{0}"" TO DISK '{1}'";
            backupdb = string.Format(backupdb, greendbfileName, copied_greendbfileName);

            SqlCommand backupcreatecomm = new SqlCommand(backupdb, backupConn);
            backupcreatecomm.ExecuteNonQuery();

            backupConn.Close();

            Environment.Exit(0);
        }
    }

经过多次尝试和分析,我终于解决了这个问题。对于那些正在寻找解决方案的人,我的分享如下

与其他数据库相比,使用MS SQL Localdb进行开发的人似乎更少

数据库的名称不必包含扩展名,例如.mdf和等号=必须作为磁盘一起使用=

string backupdb=string.Format(@“备份数据库greendb{0}到磁盘='c:\Green\u BACKUP\greendb{0}.bak',personID)

它可能会帮助某人

备份

try
{
    var dlg = new System.Windows.Forms.FolderBrowserDialog();
    var result = dlg.ShowDialog(this.GetIWin32Window());

    if (result.ToString() == "OK")
    {
        var dbfileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "LibraryManger.mdf");
        var backupConn = new SqlConnection { ConnectionString = eb.GetConnectionString() };
        backupConn.Open();

        var backupcomm = backupConn.CreateCommand();
        var backupdb = $@"BACKUP DATABASE ""{dbfileName}"" TO DISK='{Path.Combine(dlg.SelectedPath,"LibraryManagement.bak")}'";
        var backupcreatecomm = new SqlCommand(backupdb, backupConn);
        backupcreatecomm.ExecuteNonQuery();
        backupConn.Close();

        MessageBox.Show($"Database backup has successfully stored in {Path.Combine(dlg.SelectedPath, "LibraryManagement.bak")}", "Confirmation");
    }
}
catch (Exception ex)
{
    if(ex.Message.Contains("Operating system error"))
    {
        MessageBox.Show("Please chose a public folder.", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
    }
    else
        MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
}
恢复

在恢复之前,您必须关闭现有连接

try
{
    if (eb != null)
    {
        eb.DisposeConnection();
        eb = null;
    }

    var dlg = new OpenFileDialog();
    dlg.InitialDirectory = "C:\\";
    dlg.Filter = "Database file (*.bak)|*.bak";
    dlg.RestoreDirectory = true;

    if (Equals(dlg.ShowDialog(), true))
    {
        using (var con = new SqlConnection())
        {
            con.ConnectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;Database=Master;Integrated Security=True;Connect Timeout=30;";
            con.Open();
            var dbfileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "LibraryManger.mdf");
                using (var cmd = new SqlCommand())
                {
                    cmd.Connection = con;
                    cmd.CommandText = $@"RESTORE DATABASE ""{dbfileName}"" FROM DISK='{dlg.FileName}'";

                    cmd.ExecuteNonQuery();
                }
                con.Close();
            }

        MessageBox.Show($"Database backup has successfully restored.", "Confirmation");
        eb = new EntityBroker.EntityBroker();
    }
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
}

我认为您不能在SQL Server服务运行时复制mdf、ndf或ldf文件。您是否尝试使数据库脱机,然后复制?还是分离-复制-附加?或者为什么不进行简单的完整备份?@YusifYusifov,谢谢你的评论,当我试图在应用程序运行时简单地复制时,我得到了一个IOException,该进程无法访问数据库文件,因为另一个进程正在使用该文件。这就是我问这个问题的原因。SQL语法错误似乎很容易,但我没有得到正确的语法,即使我尝试了很多场景,如单引号、双引号、无引号等等…任何好主意都将受到高度赞赏!