过程或函数"用户管理"需要参数"@CallType",但未提供


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;

您的代码很混乱。对我来说,似乎您只是从其他许多地方使用了复制和粘贴,并且不太了解那里发生了什么。

应该是这样的东西:

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;

第二次分配了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

nb:简而言之,您可以使用cmd.CommandText = "UserManagement";替换有关cmd的第二个分配,因此它只是提供存储的过程名称而不是分配SqlCommand的另一个实例。另外,而不是ExecuteNonQuery()尝试使用ExecuteReader()使用DataTable.Load()方法。

最新更新