S'il vous plaît, observez l'exemple suivant le code C#:Comment capturer l'événement PRINT après une instruction SELECT dans ADO.NET?
using System;
using System.Data.SqlClient;
namespace MyApp
{
internal class Program
{
private const string SQL = "SELECT 10;PRINT 'OK'";
private static void Main(string[] args)
{
using (var c = new SqlConnection("server=localhost;trusted_connection=yes"))
{
c.Open();
c.InfoMessage += OnInfoMessage;
c.Disposed += OnConnDisposed;
Console.WriteLine("--- Select ---");
Select(c, SQL);
Console.WriteLine("--- Execute ---");
Execute(c, SQL);
Console.WriteLine("--- ExecuteScalar ---");
ExecuteScalar(c, SQL);
}
}
private static void Execute(SqlConnection c, string sql)
{
using (var cmd = c.CreateCommand())
{
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
}
}
private static void ExecuteScalar(SqlConnection c, string sql)
{
using (var cmd = c.CreateCommand())
{
cmd.CommandText = sql;
Console.WriteLine(cmd.ExecuteScalar());
}
}
private static void Select(SqlConnection c, string sql)
{
using (var cmd = c.CreateCommand())
{
cmd.CommandText = sql;
using (var reader = cmd.ExecuteReader())
{
reader.Read();
Console.WriteLine(reader.GetInt32(0));
}
}
}
private static void OnConnDisposed(object sender, EventArgs e)
{
var sqlConnection = (SqlConnection)sender;
sqlConnection.InfoMessage -= OnInfoMessage;
sqlConnection.Disposed -= OnConnDisposed;
}
private static void OnInfoMessage(object sender, SqlInfoMessageEventArgs args)
{
Console.WriteLine("PRINT");
}
}
}
Son exécution produit la sortie suivante:
--- Select ---
10
--- Execute ---
PRINT
--- ExecuteScalar ---
10
Comme vous pouvez le voir, ni Select
ni ExecuteScalar
capture l'événement PRINT
qui suit l'instruction SELECT 10
.
Comment puis-je causer Select
(je ne me soucie pas de ExecuteScalar
, il est ici pour être complet) à la fois faire le jeu de résultats et de provoquer l'événement PRINT, comme il le fait la méthode Execute
?
Stupide moi, je n'ai jamais réalisé que je devais appeler 'reader.NextResult()'. Cet appel renvoie 'false', car il n'y a pas de résultat suivant, mais en l'appelant, je provoque la capture de l'événement PRINT. – mark