Overblog Folge diesem Blog
Edit post Administration Create my blog
Blog von Olaf Helper

SqlConnection.InfoMessage Ereignis

22. April 2011 , Geschrieben von Olaf Helper Veröffentlicht in #.NET

Wenn man im SSMS = „Microsoft SQL Server Management Studio“ im Query Editor ein T-SQL Statement ausführt, hat man im Standard immer 2 Kartenreiter als Resultat: „Ergebnisse“ und „Meldungen“. Bei einfachen Statements bekommt man unter „Meldungen“ so etwas wie „(5 Zeile(n) betroffen)“ zu sehen. Bei eher administrativen Statements wie DBCC Kommandos werden schon umfangreichere Meldungen ausgegeben und auch die Texte von benutzerdefinierten Meldungen aus PRINT Anweisungen erscheinen dort.
Durchaus informative Meldungen erhält man zum Beispiel bei BACKUP DATABASE Anweisungen; wenn man den Parameter STATS mit angibt, erhält man Fortschrittsmeldungen, wie viel Prozent des Vorganges bereits abgeschlossen sind.

Wenn man solche Kommandos per ADO.NET absetzt, wäre es praktisch, solche Meldungen empfangen zu können, um dem Benutzer ein Feedback zu geben; „Jetzt sind bereits 30% des Backup Vorganges abgeschlossen.“. Nur wie?

Das geht recht einfach über das SqlConnection.InfoMessage Ereignis; hier ein kleines Beispiel als einfache Konsolen Anwendung:

 Imports System.Data.SqlClient 
 Module InfoMessage 
  Sub Main() 
  Console.WriteLine("Start backup") 
  Using conn As New SqlConnection("Data Source=.\SQL105DEV;Initial Catalog=master;Integrated Security=True;") 
   Dim sql = "BACKUP DATABASE [AdventureWorks2008R2] " & _
"TO DISK = N'AdvWorks2K8R2.bak' " & _
"WITH NOFORMAT, INIT, NAME = N'Backup AdventureWorks2008R2' " & _
", SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10;"
  Using cmd As New SqlCommand(sql, conn) 
  AddHandler conn.InfoMessage, New SqlInfoMessageEventHandler(AddressOf OnInfoMessage) 
  conn.Open()
cmd.ExecuteNonQuery()
  End Using 
  End Using 
  Console.WriteLine("Press any key to exit.")
Console.ReadKey()
  End Sub 
  Private Sub OnInfoMessage(sender As Object, args As SqlInfoMessageEventArgs) 
  Console.WriteLine(args.Message) 
  For Each err As SqlError In args.Errors
Console.WriteLine(err.Message)
Next
  End Sub 
 End Module 

 

Ergebnis:

SqlInfoMessage.jpg

 

P.S.: Der im BACKUP Command verwendet Parameter COMPRESS war in den Versionen bis einschließlich MS SQL Server 2008 ausschließlich der Enterprise Edition vorbehalten; seit SQL Server 2008 R2 geht das auch bereits ab der Standard Edition; juhu.

Diesen Post teilen

Repost 0

Kommentiere diesen Post