Ist es möglich, über ADO.NET auf die SQL Server- "Nebenproduktnachrichten" zuzugreifen? Aufgrund des Fehlens von Wörtern verstehe ich unter "Nebenproduktnachrichten" die Ausgabe, die auf der Registerkarte Nachrichten in Microsoft SQL Server Management Studio angezeigt wird. Was mir besonders wichtig ist, ist die Ausgabe von SET STATISTICS TIME ON zu lesen. Es scheint, dass SqlDataReader in dieser Angelegenheit nichts bietet.Zugriff auf SQL Server-Nachrichten über ADO.NET
Antwort
Ja, es ist ein Ereignis auf der SqlConnection
Klasse namens SqlInfoMessage
, die Sie in einhaken können:
SqlConnection _con =
new SqlConnection("server=.;database=Northwind;integrated Security=SSPI;");
_con.InfoMessage += new SqlInfoMessageEventHandler(InfoMessageHandler);
Der Event-Handler wird wie folgt aussehen:
static void InfoMessageHandler(object sender, SqlInfoMessageEventArgs e)
{
string myMsg = e.Message;
}
Die e.Message
ist die Nachricht gedruckt aus dem Nachrichtenfenster in SQL Server Management Studio.
Vielen Dank für die Antwort oben. Ich habe gerade ein kleines Experiment gemacht und einen kleinen unerwarteten Fehler (einen Fehler?) Gefunden, als ich Nachrichten (in diesem Fall von SET STATISTICS TIME ON) aus einem Multi-Recordset-Ergebnis gelesen habe. Wie unten angegeben, muss man NextResult auch nach dem letzten Resultset aufrufen, um die letzte Nachricht zu erhalten. Dies ist bei einem einzelnen Recordset-Ergebnis nicht erforderlich.
using System;
using System.Data.SqlClient;
namespace TimingTest
{
class Program
{
static void Main(string[] args)
{
SqlConnection conn = new SqlConnection("some_conn_str");
conn.Open();
conn.InfoMessage += new SqlInfoMessageEventHandler(Message);
SqlCommand cmd = new SqlCommand("some_sp", conn);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read()) { };
rdr.NextResult();
while (rdr.Read()) { };
// this is needed to print the second message
rdr.NextResult();
rdr.Close();
conn.Close();
}
static void Message(object sender, SqlInfoMessageEventArgs e)
{
Console.Out.WriteLine(e.Message);
}
}
}
Dies wäre als Antwort auf eine separate Frage, z. "Wie bekomme ich die letzte Info-Nachricht nach dem Ausführen einer Abfrage, die mehrere Ergebnissätze zurückgibt?" oder etwas ähnliches. –
Als ein Kommentar auf den Code für alle nicht bewusst, die leere While-Schleifen kann auch geschrieben werden: 'while (rdr.Read());' –
- 1. Paralleler Zugriff auf SQL Server
- 2. Zugriff auf NexusDB über Java
- 3. Wie führe ich meine .sql-Skriptdatei über ADO.NET aus?
- 4. Verbindung mit SQL Server über ADO.NET - leere Listbox
- 5. Linq to Sql mit ADO.Net Data Services
- 6. SQL Server - SQL Cursor vs ADO.NET
- 7. Zugriff Spark SQL-Datenrahmen über Dropwizard?
- 8. LINQ zu SQL vs ADO.Net
- 9. Zugriff auf VB SQL-Anweisungen
- 10. Zugriff auf die Datenbank über das Netzwerk
- 11. Unterstützt Camelot ADO.NET Connect den Hadoop-Zugriff?
- 12. Zugriff auf Serversteuerelemente über Seitenmethoden?
- 13. Zugriff auf Benutzer über C#
- 14. Zugriff auf Tabellendaten über Fremdschlüsselbezug?
- 15. Verbindungszeichenfolge von ADO.Net von SQL Server
- 16. Zugreifen auf SQL Data Services über die ADO.NET-Datendienst-Client-Bibliothek
- 17. Zugriff auf SQL Filestream verweigert
- 18. Zugriff auf Seconds_Behind_Master von SQL
- 19. Kann kein ADO.NET-Entitätsdatenmodell über Assistenten erstellen
- 20. CRUD über aggregierte root mit traditionellen ado.net
- 21. SQL Server/ADO.NET: Sperren von Problemen
- 22. Direkter Zugriff auf SQL mit Silverlight
- 23. Zugriff auf Cloud SQL von dataproc?
- 24. ADO.NET SQL Client Provider Standard-Datenbankverbindung
- 25. ADO.Net: Abrufen der Tabellendefinition aus SQL-Servertabellen
- 26. SPID eines SqlConnection (SQL-Server) in ADO.NET
- 27. Standardgrößen für SQL-Parameter in ADO.NET
- 28. LINQ-to-SQL entspricht ADO.NET EFs GetObjectByKey
- 29. Zugriff auf mehrere SQL Server-Datenbanken
- 30. SQL Server-Zeitüberschreitung Zugriff auf ASP.NET-Profilanbieter
+1 für diese. In ADO (OnInfoMessage) ist es seit über einem Jahrzehnt unter meiner Nase; Ich habe nie gewusst, was es war. –