C#:过程或函数指定的参数太多-因为数据集干扰

C#:过程或函数指定的参数太多-因为数据集干扰,c#,asp.net,sql-server,C#,Asp.net,Sql Server,当我尝试从C#代码执行更新时,主题中出现了错误 我用硬编码的值测试了代码,它是有效的 这些是硬编码的值,通过单击按钮传递给update方法,按如下方式执行,可以工作: protected void btnSubmit_Click(object sender, EventArgs e) { spe.ActionTypeID = 1; spe.ResultTypeID = -1; spe.ResultMessage = ""; spe.StorePageID = Co

当我尝试从C#代码执行更新时,主题中出现了错误

我用硬编码的值测试了代码,它是有效的

这些是硬编码的值,通过单击按钮传递给update方法,按如下方式执行,可以工作:

protected void btnSubmit_Click(object sender, EventArgs e)
{
    spe.ActionTypeID = 1;
    spe.ResultTypeID = -1;
    spe.ResultMessage = "";
    spe.StorePageID = Convert.ToInt32(Session["StorePageID"]);
    spe.SPPreambleID = 16;            
    spe.Title = txtTitle.Text;
    spe.SEOTitle = txtSEOTitle.Text;
    spe.ParentStorePageID = -1;
    spe.Meta = txtMeta.Text;
    spe.Image = null;
    spe.ImageLink = null;
    spe.Blurb = null;
    spe.RegionID = 1;
    spe.Footer = txtFooter.Text;

    count = spd.StorePage_Update(spe);

    if (count > 0)
    {
        Session["StorePageID"] = null;
        Response.Redirect("~/StorePageList.aspx");
    }
}   

public int StorePage_Update(StorePageEntity sp)
{
    try
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "cud_UpdatePage";
        cmd.Connection = con;

        if (con.State != ConnectionState.Open)
        {
            con.Open();
        }

        cmd.Parameters.AddWithValue("@ActionTypeID", SqlDbType.Int).Value = sp.ActionTypeID;
        cmd.Parameters.AddWithValue("@ResultTypeID", SqlDbType.Int).Value = sp.ResultTypeID;
        cmd.Parameters.AddWithValue("@ResultMessage", SqlDbType.VarChar).Value = sp.ResultMessage;
        cmd.Parameters.AddWithValue("@StorePageID", SqlDbType.Int).Value = sp.StorePageID;
        cmd.Parameters.AddWithValue("@SPPreambleID", SqlDbType.Int).Value = sp.SPPreambleID;
        cmd.Parameters.AddWithValue("@Title", SqlDbType.NVarChar).Value = sp.Title;
        cmd.Parameters.AddWithValue("@SEOTitle", SqlDbType.NVarChar).Value = sp.SEOTitle;
        cmd.Parameters.AddWithValue("@ParentStorePageID", SqlDbType.Int).Value = sp.ParentStorePageID;
        cmd.Parameters.AddWithValue("@Meta", SqlDbType.Text).Value = sp.Meta;
        cmd.Parameters.AddWithValue("@Image", SqlDbType.VarChar).Value = sp.Image;
        cmd.Parameters.AddWithValue("@ImageLink", SqlDbType.VarChar).Value = sp.ImageLink;
        cmd.Parameters.AddWithValue("@Blurb", SqlDbType.Text).Value = sp.Blurb;
        cmd.Parameters.AddWithValue("@RegionID", SqlDbType.Int).Value = sp.RegionID;
        cmd.Parameters.AddWithValue("@Footer", SqlDbType.Text).Value = sp.Footer;
        count = cmd.ExecuteNonQuery();                
    }            
    catch (Exception e)
    {
        Console.Write("StorePage_Update: problem with command:" + cmd + "e=" + e);
        Console.Out.Flush();
        throw new Exception("StorePage_Update: problem with command:" + cmd, e);
    }
    finally
    {
        if (con != null) { con.Close(); }
    }
    return count;
}   
但是,当我从硬编码值更改为web表单和数据库中的值时,就会出现“过程或函数有太多参数”错误

以下是使用db和web表单值时代码的外观:

protected void btnSubmit_Click(object sender, EventArgs e)
{

    spe.ActionTypeID = 1;
    spe.ResultTypeID = -1;
    spe.ResultMessage = "";
    spe.StorePageID = Convert.ToInt32(Session["StorePageID"]);

    ds = spd.StorePage_Select_One(spe.StorePageID);     

    spe.SPPreambleID = (ds.Tables[0].Rows[0].IsNull("SPPreambleID")) ? -1 : Convert.ToInt32(ds.Tables[0].Rows[0]["SPPreambleID"]);          
    spe.Title = txtTitle.Text;
    spe.SEOTitle = txtSEOTitle.Text;        
    spe.ParentStorePageID = (ds.Tables[0].Rows[0].IsNull("ParentStorePageID")) ? -1 : Convert.ToInt32(ds.Tables[0].Rows[0]["ParentStorePageID"]);       
    spe.Meta = txtMeta.Text;
    spe.Image = (ds.Tables[0].Rows[0].IsNull("Image")) ? null : ds.Tables[0].Rows[0]["Image"].ToString();
    spe.ImageLink = (ds.Tables[0].Rows[0].IsNull("ImageLink")) ? null : ds.Tables[0].Rows[0]["ImageLink"].ToString();
    spe.Blurb = (ds.Tables[0].Rows[0].IsNull("Blurb")) ? null : ds.Tables[0].Rows[0]["Blurb"].ToString();
    spe.RegionID = Convert.ToInt32(ds.Tables[0].Rows[0]["RegionID"]);
    spe.Footer = txtFooter.Text;

    count = spd.StorePage_Update(spe);

    if (count > 0)
    {
        Session["StorePageID"] = null;
        Response.Redirect("~/StorePageList.aspx");
    }
    else
    {
        Session["StorePageID"] = null;
        Response.Redirect("~/StorePageList.aspx");
    }
}
我试着注释掉每一个值和测试,但错误并没有消失

然后,我使用硬编码值进行测试,代码中保留这一行:

ds = spd.StorePage_Select_One(spe.StorePageID);     
然后它给了我同样的错误,硬编码的值

我认为这就是导致错误的原因,但我需要有一种方法来获取值,这就是我添加数据集并调用方法的原因:Page\u Select\u One

我运行了SQL Profiler,可以看出问题所在,StorePageID参数被传递了两次

以下是profiler的结果:

exec cud_UpdatePage
@StorePageID=20,
@ActionTypeID=1,
@ResultTypeID=-1,
@ResultMessage=N'',
@StorePageID=0,
@SPPreambleID=17,
@Title=N'sax store',
@SEOTitle=N'sax seo',
@ParentStorePageID=-1,
@Meta=N'text',
@Image=default,
@ImageLink=default,
@Blurb=default,
@RegionID=1,
@Footer=N'text'
更新

找出了错误。 我添加了cmd.Parameters.Clear(); 在添加参数之前,它现在可以工作了

有人能给我解释一下我怎样才能纠正这个问题吗

非常感谢您的帮助。

找出了错误。 我添加了cmd.Parameters.Clear();
在Update方法中添加参数之前,它现在可以工作。

您的代码很难理解。哪一行抛出了错误?如果您使用的是
AddWithValues
,那么您确实不需要传递数据类型,因为数据库将解析它
cmd.Parameters.AddWithValue
如果要用此方法传递数据类型,请尝试使用
cmd.Parameters.Add
。。还要对这两个方法的所有重载执行MSDN搜索
AddWithValue&Parameter.Add方法
此外,我会亲自移动
try
并将代码环绕实际的
cmd.ExecuteNonQuery()
您在哪里声明Out参数以返回
count
这可以以更简洁的方式完成..
count=spd.StorePage\u Update(spe)在这一行中,您希望更新查询的返回值是什么<代码>受影响的行数?
请阅读本文及其参考链接,以便更好地了解
ExecuteNonQuery
的功能。给出错误的行:count=cmd.ExecuteNonQuery();错误:“过程或函数指定的参数太多”实际过程代码如何?你没有算数吗?if(count>0)部分的意义是什么?无论哪种方式,它都执行相同的代码。