C# wpf-本地数据库备份

C# wpf-本地数据库备份,c#,wpf,localdb,C#,Wpf,Localdb,我已经使用LocalDB创建了一个WPF应用程序,它是使用ClickOnce安装的。应用程序应允许用户从一个系统获取数据库备份,并在其他系统上恢复相同的数据库备份,以便能够继续使用相同的数据。我无法使用公共共享数据库,因为应用程序需要脱机使用。 我计划使用指定的查询 我正在使用以下连接字符串连接到LocalDB: Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\mscdb.mdf;Integrated Security=T

我已经使用LocalDB创建了一个WPF应用程序,它是使用ClickOnce安装的。应用程序应允许用户从一个系统获取数据库备份,并在其他系统上恢复相同的数据库备份,以便能够继续使用相同的数据。我无法使用公共共享数据库,因为应用程序需要脱机使用。 我计划使用指定的查询

我正在使用以下连接字符串连接到LocalDB:

Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\mscdb.mdf;Integrated Security=True
由于我事先不知道
DataDirectory
,因此在备份时,我使用
System.Deployment.Application.ApplicationDeployment.CurrentDeployment.DataDirectory
获取数据库在用户系统上的物理位置路径。这将返回用户目录中的以下路径(我认为每个安装都会有所不同):
AppData\Local\Apps\2.0\Data\OH3O4271.782\Q6DOAYQX.3CH\msc\u 3e1c52acced2c3c\u 0001.0000\u f97f25ea480d209d\Data

我正在使用以下代码进行数据库备份

internal static void BackupDB(out string errorMessage)
{
    try
    {
        using (var conn = new SqlConnection(connectionString))
        {
            using (SqlCommand cmd = conn.CreateCommand())
            {
                string dataDirectory = System.Deployment.Application.ApplicationDeployment.CurrentDeployment.DataDirectory;
                string backupQuery = @"BACKUP DATABASE ""{0}"" TO DISK = N'{1}'";
                backupQuery = string.Format(backupQuery, dataDirectory  + "\\mscdb.mdf", "D:\\backup.bak");
                conn.Open();
                SqlCommand sqlCommand = new SqlCommand(backupQuery, conn);
                sqlCommand.ExecuteNonQuery();
                errorMessage = string.Empty;
            }
        }
    }
    catch (Exception ex)
    {
        errorMessage = ex.Message;
    }
}
  • 当我运行这段代码时,它抛出一个异常,消息是
    以{data directory path}开头的标识符太长。最大长度为128。
    如何解决此问题?由于ClickOnce将应用程序安装在用户的应用程序缓存中,因此路径总是很长

  • DataDirectory
    包含两个文件,一个主数据文件和一个事务日志文件。要在其他系统上成功恢复数据库,是否还需要备份日志文件?还原数据库的代码没有提到日志文件

  • 由于我无法继续,我甚至不确定这种方法是否能够正确地用于备份和恢复LocalDB。这样行吗?还是有更好的方法来达到我的要求


  • 这里的问题是,您无法引用mdf的路径来进行备份。相反,您必须使用数据库名称或id。 它将生成一个.bak文件,因此您无需担心ldf和mdf文件

    例如:

    BACKUP DATABASE MY_DATABASE TO DISK=N'C:\my_database.bak';
    
    RESTORE database MY_DATABASE_2 FROM DISK=N'C:\my_database.bak'
    WITH 
    MOVE N'{mdf_name}' TO N'{mdf_new_path}', 
    MOVE N'{ldf_name}' TO N'{ldf_new_path}';
    
    但是,在恢复数据库时,可能需要重新定位mdf和ldf文件的路径

    例如:

    BACKUP DATABASE MY_DATABASE TO DISK=N'C:\my_database.bak';
    
    RESTORE database MY_DATABASE_2 FROM DISK=N'C:\my_database.bak'
    WITH 
    MOVE N'{mdf_name}' TO N'{mdf_new_path}', 
    MOVE N'{ldf_name}' TO N'{ldf_new_path}';
    
    这里提供了备份和还原命令的完整语法:

    • 备份:
    • 恢复:

    我尝试只使用数据库名称,但出现了一个错误,无法找到数据库。您是否使用localdb尝试过上述代码?是的,我在localdb实例中尝试过该代码。执行此
    Select*from Sys.Databases
    ,检查当前的现有数据库。