首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >wpf - localdb备份

wpf - localdb备份
EN

Stack Overflow用户
提问于 2015-03-10 08:41:23
回答 1查看 1.4K关注 0票数 1

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

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

代码语言:javascript
复制
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

我正在使用下面的代码进行DB备份。

代码语言:javascript
复制
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时是否正确。这样可以吗?还是有更好的方法来达到我的要求?
EN

回答 1

Stack Overflow用户

发布于 2015-03-17 12:44:01

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

示例:

代码语言:javascript
复制
BACKUP DATABASE MY_DATABASE TO DISK=N'C:\my_database.bak';

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

示例:

代码语言:javascript
复制
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}';

这里有备份和还原命令的完整语法:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28959246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档