ASP.NET - SqlConnection InfoMessage显示倍数

时间:2017-11-07 16:49:54

标签: c# asp.net sql-server

我正在点击来自我正在编写的网络应用程序运行SQL Server存储过程。存储过程可能会返回一些消息,并且该消息需要在应用程序中显示。但是,该消息正在多次打印。

以下是我的代码片段:

    protected void conn_InfoMessage(object sender, SqlInfoMessageEventArgs e)
    {
        lbxMessage.Items.Add(e.Message);
    }

    protected void btnTest_Click(object sender, EventArgs e)
    {
        lbxMessage.Items.Clear();

        String ConnString = "MyConnectionString"
        SqlConnection conn = new SqlConnection(ConnString);

        SqlCommand cmd = new SqlCommand();
        cmd.Connection = conn;
        cmd.CommandTimeout = 300;
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "uspTest";

        DataSet ds = new DataSet();
        SqlDataAdapter da = new SqlDataAdapter();
        da.SelectCommand = cmd;

        conn.Open();
        conn.InfoMessage += new SqlInfoMessageEventHandler(conn_InfoMessage);
        cmd.ExecuteNonQuery();
        da.Fill(ds);
        conn.Close();
    }

在这个示例中,uspTest只打印" TEST"但显示它的列表框显示" TEST TEST"

1 个答案:

答案 0 :(得分:1)

代码正在调用存储过程两次。一旦调用da.Fill(ds)来填充数据集,一次调用ExecuteNonQuery时。

数据集不会在问题代码的任何地方使用,这意味着代码可以通过这种方式重写:

var cmd = new SqlCommand
{
    CommandText = "uspTest",
    CommandTimeout = 300,
    CommandType = CommandType.StoredProcedure
};
using (var conn = new SqlConnection(ConnString))
{
    conn.Open();                
    conn.InfoMessage += Conn_InfoMessage;


    cmd.Connection = conn;
    cmd.ExecuteNonQuery();                
}

using块确保即使发生异常也会关闭连接。

如果存储过程返回确实返回结果,则不应使用ExecuteNonQuery。代码应如下所示:

var cmd = new SqlCommand
{
    CommandText = "uspTest",
    CommandTimeout = 300,
    CommandType = CommandType.StoredProcedure
};
var da = new SqlDataAdapter
{
    SelectCommand = cmd
};
using (var conn = new SqlConnection(ConnString))
{
    conn.Open();                
    conn.InfoMessage += Conn_InfoMessage;

    var ds = new DataSet();
    cmd.Connection = conn;
    da.Fill(ds);
    //Do something with the dataset
}