wpf - localdb备份

时间:2015-03-10 08:41:23

标签: c# wpf localdb

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

我使用以下连接字符串连接到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_..tion_3e1c52eacced2c3c_0001.0000_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;
    }
}
  1. 当我运行此代码时,它会抛出一条带有消息的异常The identifier that starts with {data directory path} is too long. Maximum length is 128.如何解决此问题?由于ClickOnce将应用程序安装在用户的应用程序缓存中,因此路径将始终很长。

  2. DataDirectory包含2个文件,主数据文件和事务日志文件。我是否还需要备份日志文件以成功还原其他系统上的数据库?恢复数据库here的代码未提及日志文件。

  3. 由于我无法继续,因此我甚至不确定此方法是否可以正常用于备份和恢复LocalDB。这个可以吗?或者有更好的方法来实现我的要求吗?

1 个答案:

答案 0 :(得分:0)

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

示例:

BACKUP DATABASE MY_DATABASE TO DISK=N'C:\my_database.bak';

但是,在还原数据库时,可能需要重新定位mdf和ldf文件的路径。

示例:

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}';

这里有BACKUP和RESTORE命令的完整语法: