Получение сообщений от SQLServer во время выполнения комманд
От: mokytojas  
Дата: 14.10.03 07:47
Оценка: 6 (1)
Начальство поручило написать утилитку, которая будет уметь делать backup/restore базы данных. Написание сиквельного кода особых проблем не представляет, но для верности и первого теста решил поглядеть как это делает сам Enterprise Manager, получилос вот что:

BACKUP DATABASE [test] TO DISK = N'C:\\test.bak' WITH INIT , NOUNLOAD , NAME = N'test backup', NOSKIP , STATS = 10, NOFORMAT

So far so good. Прогнав это в query analizer'е, увидел, что, действительно, сообщения о процентах выполненой работы исправно приходят во время выполнения команды, и обрадовался, думая, что смогу просто сделать прогресс-бар в своей проге. Но не тут-то было. Приведенный ниже код вываливает все сообщения только после того, как комманда закончила выполняться, что, конечно, не может радовать:

delegate void DelegateShowMessage (string Message);
private void ShowMessage( string Message )
{
if ( InvokeRequired )
{
DelegateShowMessage MessageDelegate = new DelegateShowMessage( ShowMessage );
BeginInvoke( MessageDelegate, new object[] { Message } );
}
else
{
textBox1.Text += Message + Environment.NewLine;
}
}

private void SqlMessageArrived(object sender, SqlInfoMessageEventArgs e)
{
DelegateShowMessage MessageDelegate = new DelegateShowMessage( ShowMessage );
MessageDelegate.BeginInvoke( e.Message, null, null );
}

private void BackupDatabase()
{
SqlConnection con = new SqlConnection("server=(local);integrated security=true");
con.Open();
SqlCommand com = new SqlCommand("<тут наша команда>");
com.Connection = con;
con.InfoMessage += new SqlInfoMessageEventHandler( SqlMessageArrived );
com.ExecuteNonQuery();
con.Close();
}
private void button1_Click(object sender, System.EventArgs e)
{
ThreadStart start = new ThreadStart( BackupDatabase );
Thread myThread = new Thread( start );
myThread.Start();

}


Быть может, кто-то уже наступал на мои грабли? Или вообще невозможно получить сообщения от сиквела (средствами классов, которые входят в .net framework, пока команда выполняется? Пока не пробовал с oledb-аналогами, но есть предчуствие, что не поможет...

Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.