如何在c#中接收SQL消息?

时间:2015-01-27 10:10:30

标签: c# sql-server sql-server-2008

我想在c#

中显示这些SQL消息

image

我的C#代码:

SqlCommand cmd = new SqlCommand();
cmd = con.CreateCommand();
string ab = "";
con.FireInfoMessageEventOnUserErrors = true;
con.InfoMessage += delegate(object obj, SqlInfoMessageEventArgs err)
{
   ab = "\n " + err.Message;
   message_richTextBox.Text += (ab);
};
cmd.CommandText = @"execute my_sp ";
cmd.ExecuteNonQuery();
con.FireInfoMessageEventOnUserErrors = false;

问题:
我的问题是我没有像在C#中的SQL Server 2008(图像附件)那样获得所有SQL乱码

3 个答案:

答案 0 :(得分:1)

其中一些不是'消息' (即TDS ERRROR and INFO Messages),而是 rowcounts 。 SSMS以与Info消息类似的方式在输出中显示它们,但它们不相关。

您在SqlClient中将它们作为DML查询的返回值。换句话说,ExecuteNonQuery返回的int

  

对于UPDATE,INSERT和DELETE语句,返回值是受命令影响的行数。

正确的消息,例如“删除之前的签收”,您已经知道如何获取它们:SqlConnection.InfoMessage事件,就像您的代码一样。

答案 1 :(得分:0)

声明局部变量并将消息和受影响的rowcount分配给变量并最后选择。

使用SQLDataReader获取C#

中的消息
DECLARE @sMessage1 AS VARCHAR(100)
DECLARE @sMessage2 AS VARCHAR(100)
DECLARE @sMessage3 AS VARCHAR(100)
DECLARE @sAffectedRows1 AS VARCHAR(100)
DECLARE @sAffectedRows2 AS VARCHAR(100)
DECLARE @sAffectedRows3 AS VARCHAR(100)

SET @sMessage1  = 'something1'

First UPDATE query

SET @sAffectedRows1  = @@ROWCOUNT

SET @sMessage2  = 'something2'

Second UPDATE query

SET @sAffectedRows2  = @@ROWCOUNT

SET @sMessage3  = 'something3'

Third  UPDATE query

SET @sAffectedRows3  = @@ROWCOUNT


SELECT @sMessage1  AS Msg1, @sMessage2  AS Msg2, @sMessage3  AS Msg3, 
      @sAffectedRows1  AS Rows1, @sAffectedRows2  AS Rows2, @sAffectedRows3  AS Rows3

答案 2 :(得分:0)

我认为SQLConnection无法帮助您获取在SQL Server Management Studio中看到的那些消息。

要获得该消息,您必须执行以下操作。 (主要SMO)

  1. 使用SQL Server管理对象(您将在Microsoft网站上找到SQL服务器管理对象msi)

  2. 之后包括对这些DLL的引用并使用以下代码。

    public static void ExecuteScript(string scriptContent)
    {
    SqlConnection conn = new SqlConnection(dbConnectionString);
    conn.Open();
    Server sqlServer = new Server(new Microsoft.SqlServer.Management.Common.ServerConnection(conn));
    sqlServer.ConnectionContext.InfoMessage += new SqlInfoMessageEventHandler(ConnectionContext_InfoMessage);
    sqlServer.ConnectionContext.ServerMessage += new Microsoft.SqlServer.Management.Common.ServerMessageEventHandler(ConnectionContext_ServerMessage);
    sqlServer.ConnectionContext.ExecuteNonQuery(scriptContent);
    }
    
    static void ConnectionContext_ServerMessage(object sender, Microsoft.SqlServer.Management.Common.ServerMessageEventArgs e)
    {
    
    Console.WriteLine("Method : ConnectionContext_ServerMessage" + System.Environment.NewLine + e.Error.Message + System.Environment.NewLine);
    }
    
    static void ConnectionContext_InfoMessage(object sender, SqlInfoMessageEventArgs e)
    {                
    Console.WriteLine(System.Environment.NewLine + e.Message + System.Environment.NewLine);
    }