我在更新中遇到了一些问题。我必须构建我的自定义选择,因此我无法进行动态查询。我一直在尝试使用下面显示的代码更新我的数据库,但我总是收到此错误:
过程或函数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;
答案 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();
}