繁体   English   中英

如何在ADO.NET中执行SELECT语句后捕获PRINT事件?

[英]How to capture the PRINT event after a SELECT statement in ADO.NET?

请注意以下示例C#代码:

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");
        }
    }
}

运行它会产生以下输出:

--- Select ---
10
--- Execute ---
PRINT
--- ExecuteScalar ---
10

如您所见, SelectExecuteScalar都不捕获SELECT 10语句之后的PRINT事件。

如何使Select (我不关心ExecuteScalar ,为了完整起见,在这里)既获取结果集又导致PRINT事件,就像Execute方法一样?

当传递批处理(多个语句)时, 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将从第一个结果集的第一行返回第一个值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM