2017-09-16 5 views
0

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?

Répondre

0

Lors du passage d'un lot (instructions multiples), vous devez parcourir les résultats lorsque vous exécutez la commande Execute.

private static void Select(SqlConnection c, string sql) 
{ 
    using (var cmd = c.CreateCommand()) 
    { 
     cmd.CommandText = sql; 
     using (var reader = cmd.ExecuteReader()) 
     { 
      do 
      { 
       if (reader.Read()) 
        Console.WriteLine(reader.GetInt32(0)); 
      } 
      while (reader.NextResult()); 
     } 
    } 
} 

ExecuteScalar retournera à la première valeur de la première ligne du premier jeu de résultats.

+0

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