2014-12-02 4 views
0

У меня возникают некоторые проблемы с обновлениями. Мне пришлось создать свой индивидуальный выбор, и поэтому я не мог делать динамические запросы. Я пытался обновить свою базу данных, используя код, приведенный ниже, но я всегда получаю эту ошибку:В процедуре указано слишком много аргументов

Procedure or function UpdateUser has too many arguments specified.

Я заполнил все аргументы, не больше, не меньше, не .... Что не так?

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", "[email protected]"); 
    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; 
+2

Попробуйте указать параметры, включая '@'? Например. '.Add (" @ roleId "," ");' – Blorgbeard

+0

Не тратьте [goids!] (Http://wasteaguid.info/) - 'Guid guid = Guid.Empty();' – asawyer

+0

посмотреть, как используйте функцию Parameter.Add() и функцию Parameter.AddWithValue(), вам также нужно указать 'DataType' так, как вы ее используете. Я бы изменил' Add' на 'AddWithValue' таким образом, чтобы база данных могла обрабатывать разрешение типа данных – MethodMan

ответ

0

Вопрос заключается в том, как SqlDataSource работ, в частности в ConflictDetection.

Как MSDN says:

The ConflictDetection property determines whether parameters for old and new values are applied to the Update method. For example, if the command that is specified by the SelectCommand property returns a DataTable object with the columns Name and Number and the ConflictDetection property is set to the OverwriteChanges value, parameters are created for Name and Number for the Update method.

Так что, если ваши 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", "[email protected]"); 
    ds.UpdateParameters.Add("isAnonimo", "0"); 
    ds.UpdateParameters.Add("isLocked", "0"); 
    ds.UpdateParameters.Add("roleId", ""); 

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

'Rhumbori' Я думаю, что вы что-то наделали. Я все еще думаю, что это могло бы быть разрешено, если бы OP просто реорганизовал код для использования' SqlConnection && SQLCommand Object's', и если бы OP использовал бы Command.Parameters.Add метод перегрузки функции правильно – MethodMan

+0

пытался, но не работал! – Severiano

+1

попробовал что-то и не работал .. вы делаете простой процесс сложнее, чем его нужно «Severiano». Я действительно не знаю, почему вы пытаетесь обновить AllUsers таким образом, что хотите, когда все, что вам нужно сделать, это вызовите нормальный 'StoredProcedure' из кода C#, а затем выполните команду' cmd.ExecuteNonQuery', используя SqlDataClient, намного проще, чем вращать ваши колеса по-моему. – MethodMan

Смежные вопросы