C#SQL将数据库还原到默认数据位置

C#SQL将数据库还原到默认数据位置,c#,sql,C#,Sql,我正在编写一个C#应用程序,它通过FTP下载压缩的数据库备份。然后,应用程序需要提取备份并将其恢复到默认数据库位置 我不知道在运行应用程序的计算机上将安装哪个版本的SQL Server。因此,我需要根据实例名(在配置文件中)找到默认位置 我发现的所有示例都有一个他们读取的注册表项,但这不起作用,因为这假设只安装了一个SQL实例 我发现的另一个例子是创建了一个数据库,读取该数据库的文件属性,一旦完成就删除该数据库。那太麻烦了 我确实在.NET framework中发现了一些应该有效的东西,即:

我正在编写一个C#应用程序,它通过FTP下载压缩的数据库备份。然后,应用程序需要提取备份并将其恢复到默认数据库位置

我不知道在运行应用程序的计算机上将安装哪个版本的SQL Server。因此,我需要根据实例名(在配置文件中)找到默认位置

我发现的所有示例都有一个他们读取的注册表项,但这不起作用,因为这假设只安装了一个SQL实例

我发现的另一个例子是创建了一个数据库,读取该数据库的文件属性,一旦完成就删除该数据库。那太麻烦了

我确实在.NET framework中发现了一些应该有效的东西,即:

问题是,这返回的是空字符串,这没有帮助


我还需要找出运行SQL服务的NT帐户,以便在提取备份文件后,我可以授予该用户对备份文件的读取权限。

一个可能更简单的解决方案是,在目标服务器上创建一个新数据库,然后使用备份通过该数据库进行恢复。您的备份将放在正确的位置,在恢复备份文件时,您不必为“移动”备份文件而烦恼。SQL希望将备份还原到与备份时使用的物理路径完全相同的位置。如果不是这样,则必须在恢复期间使用移动选项。
例如,如果您想在名称上加上日期,此解决方案还可以更轻松地在过程中重命名数据库。

一种方法是使用与主数据库相同的位置。您可以使用以下SQL查询SQL Server实例:

select filename from master.dbo.sysdatabases where name = 'master'

这将返回主数据库的完整路径。通过该路径,您可以使用FileInfo对象提取该路径的目录部分。这避免了在注册表中检查您试图连接的SQL Server实例的猜测工作。

我发现的是

Microsoft.SqlServer.Management.Smo.Server(ServerName).Settings.DefaultFile
仅在没有显式定义路径时返回非null。一旦指定了非默认路径,则此函数将正确返回该路径

因此,一个简单的解决方法是检查此函数是否返回字符串或null。如果它返回一个字符串,则使用该字符串,但如果为null,则使用

Microsoft.SqlServer.Management.Smo.Server(ServerName).Information.RootDirectory + "\\DATA\\"

这不一定会返回与默认路径相同的结果。创建主数据库后,可以更改默认路径,并且主数据库无需随之移动。在这种情况下,您需要读取注册表项HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.X,其中X是实例号,检查是否定义了DefaultData和DefaultLog。您如何知道您看到的是正确的实例号?我所要做的就是实例名。除了运行在计算机上的代码之外,我将无法访问该计算机。这是一个好主意,但我不想使用MDF和LDF文件的默认名称。我想把邮戳也包括在内。为了做到这一点,我需要在创建临时数据库时指定文件名,这让我回到了需要默认路径的状态。一个可能对您有用的技巧是使用包含完整时间戳的名称创建数据库,然后将数据库重命名为它应该是的任何名称。重命名数据库不会更改文件名。这样创建的文件名就正确了。Darrel,要指定文件名,需要指定完整路径。SQL似乎没有任何相对路径的概念。我想它对您有用。我尝试过同样的命令,但不起作用。我抛出了一个关于“无法连接到MYCOMPUTERNAME”的异常。我不认为这是防火墙的问题。也许是许可范围?ServerName是一个字符串,对吗?会更好(新的Microsoft.SqlServer.Management.Smo.Server(yourServerName)).Information.RootDirectory?太棒了!我已经挖了好几天了。
Microsoft.SqlServer.Management.Smo.Server(ServerName).Information.RootDirectory + "\\DATA\\"