【问题标题】:Procedure or function 'UserManagement' expects parameter '@CallType', which was not supplied [duplicate]过程或函数“UserManagement”需要未提供的参数“@CallType”[重复]
【发布时间】:2017-04-18 05:52:09
【问题描述】:
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;

【问题讨论】:

  • 您第二次使用cmd = new SqlCommand("UserManagement", con); 初始化另一个SqlCommand 实例,因此现有参数已被删除。请改用cmd.CommandText = "UserManagement"(如有必要,我会在几分钟内写一个答案来解决这个问题)。

标签: c# asp.net sql-server


【解决方案1】:

您的代码一团糟。在我看来,您似乎只是使用了许多其他地方的复制和粘贴,并且不太了解那里发生了什么。

应该是这样的:

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;

【讨论】:

    【解决方案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.CommandText = "UserManagement"; 替换有问题的cmd 的第二个分配,因此它只提供存储过程名称而不是分配SqlCommand 的另一个实例。也可以代替 ExecuteNonQuery() 尝试使用 ExecuteReader()DataTable.Load() 方法。

    【讨论】:

    • 谢谢.....它成功了
    猜你喜欢
    • 2014-11-10
    • 2011-02-05
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多