我正在尝试编写一个C#应用程序,用于从放置在某个文件夹中的.bak
个文件中恢复许多数据库。为此,我需要文件中的数据库逻辑名称。
所以我想执行以下查询:
RESTORE FILELISTONLY FROM DISK = N'C:\Folder\File'
问题是:我无法将此结果发送到我的应用程序,当我在SQL Server Management Studio中执行它时,它会显示我想要的名称。
我尝试使用ExecuteReader
中的SqlDataReader
函数,但它没有返回任何数据。
有人可以帮我弄清楚如何将恢复数据库,备份数据库等查询结果转换为C#应用程序中的变量吗?
提前致谢
答案 0 :(得分:2)
命令RESTORE FILELISTONLY
确实根据文档RESTORE Statement - FILELISTONLY返回结果集。我在测试代码时发现的,您需要确保运行该应用程序的用户有权读取指定的文件和目录。否则你会遇到问题。
有关此代码示例:
var command = @"RESTORE FILELISTONLY FROM DISK = N'F:\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\Scratch.bak'";
using (var sqlConnection = new SqlConnection("Server=localhost;Database=Scratch;Trusted_Connection=True;"))
using (var sqlCommand = new SqlCommand(command, sqlConnection))
{
sqlConnection.Open();
var sqlDataReader = sqlCommand.ExecuteReader();
while (sqlDataReader.Read())
{
Console.WriteLine($"Logical Name: {sqlDataReader["LogicalName"]}");
Console.WriteLine($"Physical Name: {sqlDataReader["PhysicalName"]}");
Console.WriteLine($"Type: {sqlDataReader["Type"]}");
}
}
您可能还会发现,在尝试使用SQL Server管理时,使用SqlConnection
和SqlCommand
对象可能会更令人沮丧,因此它们值得。我强烈建议使用SQL Server管理对象(SMO)。这实际上是您在使用SQL Server时管理工作室使用的内容。如果你对它感兴趣我在GitHub上有一个例子。结帐GitHub: SMO Demo。