String strConnString = ConfigurationManager.ConnectionStrings["CallcenterConnectionString"].ConnectionString;
SqlConnection con = new SqlConnection(strConnString);
SqlCommand cmd = new SqlCommand();
cmd.Parameters.Add("@CallType", SqlDbType.VarChar).Value = ddlCalltype.SelectedValue.ToString();
cmd.Parameters.Add("@Format", SqlDbType.VarChar).Value = ddlFormat.SelectedValue.ToString();
cmd.Parameters.Add("@disposition", SqlDbType.VarChar).Value = ddlDisp.SelectedValue.ToString();
cmd.Parameters.Add("@SubDisposition", SqlDbType.VarChar).Value = ddlSubdisp.SelectedValue.ToString();
cmd = new SqlCommand("UserManagement", con);
cmd.CommandType = CommandType.StoredProcedure;
con.Open();
cmd.ExecuteNonQuery();
con.Close();
SqlDataAdapter da = new SqlDataAdapter();
DataTable dt = new DataTable();
da.SelectCommand = cmd;
da.Fill(dt);
gvDetails.DataSource = dt;
gvDetails.DataBind();
gvDetails.Visible = true;
答案 0 :(得分:3)
你的代码很乱。对我来说,看起来你刚从其他地方使用过复制和粘贴,并且不太了解那里发生了什么。
它应该是这样的:
String strConnString = ConfigurationManager.ConnectionStrings["CallcenterConnectionString"].ConnectionString;
DataTable dt = new DataTable();
using(var con = new SqlConnection(strConnString))
{
using(var cmd = new SqlCommand("UserManagement", con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@CallType", SqlDbType.VarChar).Value = ddlCalltype.SelectedValue.ToString();
cmd.Parameters.Add("@Format", SqlDbType.VarChar).Value = ddlFormat.SelectedValue.ToString();
cmd.Parameters.Add("@disposition", SqlDbType.VarChar).Value = ddlDisp.SelectedValue.ToString();
cmd.Parameters.Add("@SubDisposition", SqlDbType.VarChar).Value = ddlSubdisp.SelectedValue.ToString();
using(var da = new SqlDataAdapter())
{
da.SelectCommand = cmd;
da.Fill(dt);
}
}
}
gvDetails.DataSource = dt;
gvDetails.DataBind();
gvDetails.Visible = true;
答案 1 :(得分:2)
此行第二次将SqlCommand
的新实例分配给cmd
,而不是使用包含已声明参数的现有SqlCommand
,因此删除了上面已声明的所有参数:
cmd = new SqlCommand("UserManagement", con);
使用参数化存储过程管理SqlCommand
的正确方法应该是这样的,使用using
语句来管理执行期间的系统资源(如果你想要更好地使用try...catch...finally
块句柄SqlException
):
String strConnString = ConfigurationManager.ConnectionStrings["CallcenterConnectionString"].ConnectionString;
var dt = new DataTable();
using (var con = new SqlConnection(strConnString))
{
con.Open();
using (var cmd = new SqlCommand("UserManagement", con))
{
cmd.Parameters.Add("@CallType", SqlDbType.VarChar).Value = ddlCalltype.SelectedValue.ToString();
cmd.Parameters.Add("@Format", SqlDbType.VarChar).Value = ddlFormat.SelectedValue.ToString();
cmd.Parameters.Add("@disposition", SqlDbType.VarChar).Value = ddlDisp.SelectedValue.ToString();
cmd.Parameters.Add("@SubDisposition", SqlDbType.VarChar).Value = ddlSubdisp.SelectedValue.ToString();
cmd.CommandType = CommandType.StoredProcedure;
// using SqlDataAdapter
using (var da = new SqlDataAdapter)
{
da.SelectCommand = cmd;
da.Fill(dt);
}
// using DataTable.Load directly
// dt.Load(cmd.ExecuteReader());
}
con.Close();
}
// other stuff
注意:简而言之,您可以使用cmd
替换有问题的cmd.CommandText = "UserManagement";
的第二个分配,因此它只提供存储过程名称,而是分配另一个SqlCommand
实例。而且ExecuteNonQuery()
代替ExecuteReader()
尝试使用DataTable.Load()
方法{/ 1}}。