C# SQL 将数据库恢复到默认数据位置
Posted
技术标签:
【中文标题】C# SQL 将数据库恢复到默认数据位置【英文标题】:C# SQL Restore database to default data location 【发布时间】:2010-09-08 22:42:29 【问题描述】:我正在编写一个通过 FTP 下载压缩数据库备份的 C# 应用程序。然后,应用程序需要提取备份并将其恢复到默认数据库位置。
我不知道将在运行应用程序的机器上安装哪个版本的 SQL Server。因此,我需要根据实例名称(在配置文件中)找到默认位置。
我发现的所有示例都有一个可以读取的注册表项,但这不起作用,因为这假定只安装了一个 SQL 实例。
我发现另一个示例创建了一个数据库,读取该数据库的文件属性,完成后删除数据库。太麻烦了。
我确实在 .NET 框架中找到了一些应该可以工作的东西,即:
Microsoft.SqlServer.Management.Smo.Server(ServerName).Settings.DefaultFile
问题是这会返回空字符串,这无济于事。
我还需要找出运行 SQL 服务的 NT 帐户,以便在提取备份文件后授予该用户对备份文件的读取权限。
【问题讨论】:
【参考方案1】:我发现
Microsoft.SqlServer.Management.Smo.Server(ServerName).Settings.DefaultFile
只有在没有明确定义路径时才返回非空值。只要您指定了一个非默认路径,此函数就会正确返回该路径。
因此,一个简单的解决方法是检查此函数是否返回字符串或 null。如果它返回一个字符串,则使用它,但如果它为空,则使用
Microsoft.SqlServer.Management.Smo.Server(ServerName).Information.RootDirectory + "\\DATA\\"
【讨论】:
我认为它对你有用。我已经尝试过相同的命令,但它不起作用。我抛出一个关于“无法连接到 MYCOMPUTERNAME”的异常。我认为这不是防火墙问题。也许权限范围? ServerName 是一个字符串,对吗?会更好 (new Microsoft.SqlServer.Management.Smo.Server(yourServerName)).Information.RootDirectory ? 太棒了!已经为此挖掘了几天。【参考方案2】:一种方法是使用与主数据库相同的位置。您可以使用以下 SQL 查询 SQL Server 实例:
select filename from master.dbo.sysdatabases where name = 'master'
这将返回主数据库的完整路径。使用该路径,您可以使用 FileInfo 对象仅提取该路径的目录部分。这避免了为您尝试连接的 SQL Server 实例检查注册表的猜测工作。
【讨论】:
这不一定会返回与默认路径相同的结果。主库创建后可以更改默认路径,主库不需要随之移动。 在这种情况下,您需要读取注册表项 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.X,其中 X 是实例编号并检查 DefaultData 和 DefaultLog 是否已已定义。 您如何知道您正在查看正确的实例编号?我所要做的就是实例名称。除了运行在机器上的代码之外,我无法访问机器。【参考方案3】:一个可能是更简单的解决方案的选项是在您的目标服务器上创建一个新数据库,然后使用您的备份在该数据库上恢复。您的备份将在正确的位置,当您恢复备份文件时,您不必大惊小怪地“移动”备份文件。 SQL 期望备份恢复到与它们备份时完全相同的物理路径。如果不是这种情况,您必须在 RESTORE 期间使用 MOVE 选项。 此解决方案还可以更轻松地在此过程中重命名数据库,例如,如果您想在名称上添加日期。
【讨论】:
这是个好主意,但我不想为 MDF 和 LDF 文件使用默认名称。我希望那些包含日期戳。为了做到这一点,我需要在创建临时数据库时指定文件名,这让我回到需要默认路径。 可能对您有用的一个技巧是使用包含完整时间戳的名称创建数据库,然后将数据库重命名为应有的名称。重命名数据库不会更改文件名。这样就可以使用正确的名称创建文件。 Darrel,为了指定文件名,你需要指定完整路径。 SQL 似乎没有任何相对路径的概念。以上是关于C# SQL 将数据库恢复到默认数据位置的主要内容,如果未能解决你的问题,请参考以下文章
C# SQL Server 将远程数据库备份到远程默认备份位置而不直接访问远程位置?