C#:过程或函数指定的参数太多-因为数据集干扰
当我尝试从C#代码执行更新时,主题中出现了错误 我用硬编码的值测试了代码,它是有效的 这些是硬编码的值,通过单击按钮传递给update方法,按如下方式执行,可以工作: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
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)部分的意义是什么?无论哪种方式,它都执行相同的代码。