【问题标题】:Procedure has too many arguments specified过程指定的参数过多
【发布时间】:2015-01-31 03:43:27
【问题描述】:

我在更新时遇到了一些问题。我必须构建我的自定义选择,所以我无法进行动态查询。我一直在尝试使用下面显示的代码更新我的数据库,但我总是收到此错误:

过程或函数 UpdateUser 指定了太多参数。

我已经填写了所有的论点,不多也不少......怎么了?

ASPX 标记:

<asp:SqlDataSource ID="AllUsers" runat="server" 
    ConnectionString="<%$ ConnectionStrings:LocalSQL %>"
    SelectCommand="TodosOsUtilizadores" SelectCommandType="StoredProcedure">
</asp:SqlDataSource>

C# 代码隐藏:

using (SqlDataSource ds = AllUsers)
{
    Guid guid = new Guid();

    try
    {
        guid = Guid.Parse(Session["user_id"].ToString());
    }
    catch 
    { 
        guid = Guid.NewGuid(); 
    }

    ds.UpdateCommand = "UpdateUser";
    ds.ConflictDetection = ConflictOptions.OverwriteChanges;
    ds.UpdateCommandType = SqlDataSourceCommandType.StoredProcedure;
    ds.UpdateParameters.Add("userid", guid.ToString());
    ds.UpdateParameters.Add("username", "Diogo");
    ds.UpdateParameters.Add("email", "user_test@gmail.com");
    ds.UpdateParameters.Add("isAnonimo", "0");
    ds.UpdateParameters.Add("isLocked", "0");
    ds.UpdateParameters.Add("roleId", "");

    ds.Update();
    DetailsView1.DataBind();
}

存储过程:

CREATE PROCEDURE [dbo].UpdateUser
    @userid nvarchar(max),
    @username nvarchar(200),
    @email nvarchar(500),
    @isAnonimo bit, 
    @isLocked bit,
    @roleid nvarchar(max)
AS
    UPDATE Memberships 
    SET Email = @email, 
        IsLockedOut = @isLocked 
    WHERE 
        UserId = CAST(@userid as uniqueidentifier);

    UPDATE Users 
    SET UserName = @username, 
        IsAnonymous = @isAnonimo 
    WHERE 
        UserId = CAST(@userid AS uniqueidentifier);

    IF (@roleid IS NULL) 
    BEGIN
        UPDATE UsersInRoles 
        SET RoleId = CAST(roleid AS uniqueidentifier);
    END;

【问题讨论】:

  • 尝试指定参数包括@?例如。 .Add("@roleId", "");
  • 不要waste guids! - Guid guid = Guid.Empty();
  • 查找如何使用Parameter.Add() Function vs the Parameter.AddWithValue() Function 您还需要指定DataType 您使用它的方式 我会将Add 更改为AddWithValue 这样数据库可以处理解析数据类型
  • @asawyer new Guid() 给你000-000... - 还剩下很多!
  • 不要使用异常处理来设置 guid,而是考虑使用 TryParse(仅 2 行代码):Guid guid; Guid.TryParse(Session["user_id"].ToString(), out guid);

标签: c# asp.net sql-server


【解决方案1】:

问题在于SqlDataSource 的工作方式,特别是ConflictDetection

作为MSDN says:

ConflictDetection 属性确定是否将旧值和新值的参数应用于 Update 方法。例如,如果SelectCommand 属性指定的命令返回具有名称和编号列的DataTable 对象,并且ConflictDetection 属性设置为OverwriteChanges 值,则为名称创建参数Update 方法的编号。

因此,如果您的 SelectCommand 返回例如firstname,那么您的UpdateCommand 中也已经有一个firstname 参数,这就是导致错误的原因。

不确定它是否会起作用,但一个简单的尝试是先清除UpdateParameters 集合:

using (SqlDataSource ds = AllUsers)
{
    Guid guid = new Guid();
    try
    {
        guid = Guid.Parse(Session["user_id"].ToString());
    }
    catch { guid = Guid.NewGuid(); }

    ds.UpdateCommand = "UpdateUser";
    ds.ConflictDetection = ConflictOptions.OverwriteChanges;
    ds.UpdateCommandType = SqlDataSourceCommandType.StoredProcedure;

    ds.UpdateParameters.Clear();

    ds.UpdateParameters.Add("userid", guid.ToString());
    ds.UpdateParameters.Add("username", "Diogo");
    ds.UpdateParameters.Add("email", "user_test@gmail.com");
    ds.UpdateParameters.Add("isAnonimo", "0");
    ds.UpdateParameters.Add("isLocked", "0");
    ds.UpdateParameters.Add("roleId", "");

    ds.Update();
    DetailsView1.DataBind();
}

【讨论】:

  • Rhumbori 我认为您正在做某事.. 我仍然认为如果 OP 将代码重构为使用 SqlConnection &amp;&amp;SQLCommand Object's 并且如果 OP 将使用命令,则可以解决此问题.Parameters.Add 方法重载函数正确
  • 试过什么但没有成功..你让一个简单的过程比它需要的更难Severiano我真的不知道你为什么要尝试以这种方式更新 AllUsers 任何想要的当你需要做的就是从 C# 代码中调用一个普通的StoredProcedure,然后使用 SqlDataClient 执行cmd.ExecuteNonQuery 命令,在我看来比转动你的轮子要容易得多
  • ds.UpdateParameters("@userid") = guid.ToString(); ??
  • 好的,我试图将答案建立在原始问题的基础上——它在实际绑定场景中是有效的。由于您似乎忽略了SqlDataSource 的数据绑定方面,所以我也会使用标准的 SqlConnection,SqlCommand
猜你喜欢
  • 1970-01-01
  • 2018-06-30
  • 2023-03-26
  • 2014-02-08
相关资源
最近更新 更多