C# 如何从t-sql过程传递警告消息?

C# 如何从t-sql过程传递警告消息?,c#,sql,sql-server,tsql,C#,Sql,Sql Server,Tsql,我用C代码调用这个过程。是否可能以某种方式将警告消息从过程传递给调用者,如调用或其他方式 试试看 { if(connection.State!=ConnectionState.Open)connection.Open(); var cmd=connection.CreateCommand(); cmd.CommandTimeout=cfg.CmdTimeout; cmd.CommandType=CommandType.storedProcess; cmd.CommandText=“dbo.tes

我用C代码调用这个过程。是否可能以某种方式将警告消息从过程传递给调用者,如调用或其他方式

试试看
{
if(connection.State!=ConnectionState.Open)connection.Open();
var cmd=connection.CreateCommand();
cmd.CommandTimeout=cfg.CmdTimeout;
cmd.CommandType=CommandType.storedProcess;
cmd.CommandText=“dbo.test”;
var ParamReturn=cmd.Parameters.Add(“@RETURN\u VALUE”,SqlDbType.Int);
ParamReturn.Direction=ParameterDirection.ReturnValue;
cmd.ExecuteNonQuery();
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message,“Test”);
}
创建过程测试
像
开始
不计数;
NOWAIT的RAISERROR(N'Kuku1',0,0)
选择@@VERSION作为'@@VERSION'
NOWAIT的RAISERROR(N'Kuku2',0,0)
选择@LANGID作为'@@LANGID'
带NOWAIT的RAISERROR(N'Pisec',0,0)
返回@连接
终止
去
您可以通过连接的
InfoMessage
属性读取消息(通过
PRINT
RAISERROR
发送,严重性为10或以下):

using (var command = new SqlCommand(query, connection))
{
    command.CommandTimeout = 0;              
    var infoCaptureHandler = new SqlInfoMessageEventHandler((sender, args) =>
        {
            if (!String.IsNullOrWhiteSpace(args.Message))
            {
                Console.WriteLineLine(args.Message);
            }
        });

    connection.InfoMessage += infoCaptureHandler;
    try
    {
        command.ExecuteReader();
    }
    finally
    {
        connection.InfoMessage -= infoCaptureHandler;
    }
}
您可以通过连接的
InfoMessage
属性读取消息(通过
PRINT
发送,或通过
RAISERROR
发送,严重程度不超过10):

using (var command = new SqlCommand(query, connection))
{
    command.CommandTimeout = 0;              
    var infoCaptureHandler = new SqlInfoMessageEventHandler((sender, args) =>
        {
            if (!String.IsNullOrWhiteSpace(args.Message))
            {
                Console.WriteLineLine(args.Message);
            }
        });

    connection.InfoMessage += infoCaptureHandler;
    try
    {
        command.ExecuteReader();
    }
    finally
    {
        connection.InfoMessage -= infoCaptureHandler;
    }
}

严重性为10或以下的
RAISERROR
也会触发
Infomessage
,因此问题中的代码也会触发它
PRINT
的严重性为0。严重性为10或以下的
RAISERROR
也会触发
Infomessage
,因此问题中的代码也会触发它<代码>打印的严重性为0。