[英]How to capture a null Parameter and allow Parsing with DBNull in ADO.NET
[英]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
如您所见, Select
或ExecuteScalar
都不捕获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.