Get progress of backup ms sql base from c#

если выполняется длительный бекап базы, то прогресс выполнения в MS SQL Studio можно посмотреть запросом:

SELECT
    [command]
    ,[status]
    ,[session_id]
    ,[start_time]
    ,[percent_complete]
    ,[estimated_completion_time] / 60000. AS [estimated_completion_time_min]
FROM sys.dm_exec_requests
WHERE [command] LIKE 'BACKUP%'

введите сюда описание изображения

А как получить эти данные из программы на c#?

using System;
using System.Data.SqlClient;

public class BackupProgressTracker
{
    private string serverName;
    private string databaseName;

    public BackupProgressTracker(string serverName, string databaseName)
    {
        this.serverName = serverName;
        this.databaseName = databaseName;
    }

    public void TrackBackupProgress()
    {
        string connectionString = $"Data Source={serverName};Initial Catalog={databaseName};Integrated Security=True";
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();

            string query = $"SELECT percent_complete, estimated_completion_time FROM sys.dm_exec_requests WHERE command LIKE 'BACKUP%' AND database_id = DB_ID('{databaseName}')";
            using (SqlCommand command = new SqlCommand(query, connection))
            {
                using (SqlDataReader reader = command.ExecuteReader())
                {
                    if (reader.Read())
                    {
                        int percentComplete = reader.GetInt32(0);
                        int estimatedCompletionTime = reader.GetInt32(1);

                        TimeSpan remainingTime = TimeSpan.FromMilliseconds(estimatedCompletionTime);
                        int remainingMinutes = (int)remainingTime.TotalMinutes;

                        Console.WriteLine($"Backup Progress: {percentComplete}%, Remaining Time: {remainingMinutes} minutes");
                    }
                }
            }
        }
    }
}

public class Program
{
    public static void Main()
    {
        string serverName = "srv1";
        string databaseName = "base1";

        BackupProgressTracker tracker = new BackupProgressTracker(serverName, databaseName);
        tracker.TrackBackupProgress();
    }
}

если запрос выполнять когда бекап не делается, то естественно ничего не выводится, а если во время бекапа, то получаем ошибку. грешил на

int percentComplete = reader.GetInt32(0); 

похоже там double, но смена эффекта не дает.

System.InvalidCastException
  HResult=0x80004002
  Сообщение = Заданное приведение является недопустимым.
  Источник = System.Data
  Трассировка стека:
   at System.Data.SqlClient.SqlBuffer.get_Int32()
   at System.Data.SqlClient.SqlDataReader.GetInt3`введите сюда код`2(Int32 i)
   at BackupProgressTracker.TrackBackupProgress() in C:\code\BackupProgressTracker\Program.cs:line 29
   at Program.Main() in C:\code\BackupProgressTracker\Program.cs:line 51

Ответы (1 шт):

Автор решения: Eugene Firstov

Всем спасибо за подсказки, действительно нужно было определиться с типом данных. исправленный код дает верный результат:

using (SqlDataReader reader = command.ExecuteReader())
{
    while (reader.Read())
    {
        for (int i = 0; i < reader.FieldCount; i++)
        {
            Console.Write(reader[i] + "\t");
            
            float percentcomplete = reader.GetFloat(0);
            Console.WriteLine("Percent complete: " + percentcomplete);//good
            
            long estimated_completion_time = reader.GetInt64(1);
            Console.WriteLine("estimated_completion_time: " + estimated_completion_time);

        }
        Console.WriteLine();
    }
    Console.ReadKey();
}

введите сюда описание изображения

→ Ссылка