C#SQL将数据库还原到默认数据位置
时间:2020-03-05 18:53:31 来源:igfitidea点击:
我正在编写一个C应用程序,该程序通过FTP下载压缩的数据库备份。然后,应用程序需要提取备份并将其还原到默认数据库位置。
我不知道将在运行该应用程序的计算机上安装哪个版本的SQL Server。因此,我需要根据实例名称(位于配置文件中)查找默认位置。
我发现所有示例均具有读取的注册表项,但这将不起作用,因为这假定仅安装了一个SQL实例。
我发现的另一个示例创建了一个数据库,读取了该数据库的文件属性,并在完成后删除了该数据库。那太麻烦了。
我确实在.NET框架中找到了应该起作用的东西,即:
Microsoft.SqlServer.Management.Smo.Server(ServerName).Settings.DefaultFile
问题在于这将返回空字符串,这无济于事。
我还需要找出运行SQL服务的NT帐户,以便一旦提取了该文件,就可以授予该用户对该备份文件的读取访问权限。
解决方案
回答
一种可能是更简单的解决方案的选择是在目标服务器上创建一个新数据库,然后使用备份在该数据库上还原。备份将放置在正确的位置,并且在还原备份文件时不必大惊小怪。 SQL希望将备份还原到与备份完全相同的物理路径。如果不是这种情况,则必须在RESTORE期间使用MOVE选项。
例如,如果我们想在名称上加上日期,此解决方案还使在此过程中重命名数据库更加容易。
回答
一种方法是使用与主数据库相同的位置。我们可以使用以下SQL查询SQL Server实例:
select filename from master.dbo.sysdatabases where name = 'master'
这将返回master数据库的完整路径。通过该路径,可以使用FileInfo对象提取该路径的目录部分。这样就避免了为检查要尝试连接的SQL Server实例检查注册表的猜测工作。
回答
我发现的是
Microsoft.SqlServer.Management.Smo.Server(ServerName).Settings.DefaultFile
仅当没有明确定义的路径时,才返回非空值。一旦指定的路径不是默认路径,此函数将正确返回该路径。
因此,一种简单的解决方法是检查此函数是否返回字符串或者null。如果返回字符串,则使用该字符串,但如果为null,则使用
Microsoft.SqlServer.Management.Smo.Server(ServerName).Information.RootDirectory + "\DATA\"