过程或函数'UserManagement'需要参数'@CallType',这是未提供的

时间:2017-04-18 05:52:10

标签: c# asp.net sql-server

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;

2 个答案:

答案 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}}。