过程指定了太多参数

时间:2014-12-02 19:15:11

标签: c# asp.net sql-server

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

  

过程或函数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;

1 个答案:

答案 0 :(得分:0)

问题在于SqlDataSource的工作原理,特别是ConflictDetection

作为MSDN says

  

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

因此,如果您的SelectCommand返回, firstname,您的firstname中已经存在UpdateCommand参数,这就是造成错误的原因。

不确定它是否有效,但尝试一件简单的事情就是首先清除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();
}