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();
}

