在C#Application

时间:2017-08-04 16:44:03

标签: c# sql-server

我正在尝试编写一个C#应用程序,用于从放置在某个文件夹中的.bak个文件中恢复许多数据库。为此,我需要文件中的数据库逻辑名称。

所以我想执行以下查询:

RESTORE FILELISTONLY FROM DISK = N'C:\Folder\File'

问题是:我无法将此结果发送到我的应用程序,当我在SQL Server Management Studio中执行它时,它会显示我想要的名称。

我尝试使用ExecuteReader中的SqlDataReader函数,但它没有返回任何数据。

有人可以帮我弄清楚如何将恢复数据库,备份数据库等查询结果转换为C#应用程序中的变量吗?

提前致谢

1 个答案:

答案 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管理时,使用SqlConnectionSqlCommand对象可能会更令人沮丧,因此它们值得。我强烈建议使用SQL Server管理对象(SMO)。这实际上是您在使用SQL Server时管理工作室使用的内容。如果你对它感兴趣我在GitHub上有一个例子。结帐GitHub: SMO Demo