我想在c#
中显示这些SQL消息
我的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乱码
答案 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)
使用SQL Server管理对象(您将在Microsoft网站上找到SQL服务器管理对象msi)
之后包括对这些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);
}