我正在点击来自我正在编写的网络应用程序运行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"
答案 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
}