2011-04-22 38 views
7

Me aparece un errorprocedimiento o función tiene demasiados argumentos especificados

procedimiento o función "myStoreProcNameHere" ha especificado demasiados argumentos.

Debajo está mi procedimiento almacenado y SqlDataSource. Estoy usando un GridView para editar datos.

¿Ayuda? :(

procedimiento almacenado:

ALTER PROCEDURE UpdateTwoTables 
    (@ID int, 
    @UserID varchar(10), 
    @Pass varchar(50), 
    @Enabled int, 
    @Permission int, 
    @Rank int, 
    @FName varchar(50), 
    @LName varchar(50), 
    @Phone varchar(50), 
    @Email1 varchar(50), 
    @Email2 varchar(50) 
    ) 
AS 
BEGIN TRANSACTION 
    UPDATE tbl_user_login 
    SET UserID = @UserID, Pass = @Pass, 
     Enabled = @Enabled, Permission = @Permission, 
     Rank = @Rank 
    WHERE ID = @ID 

    IF @@ERROR <> 0 
    BEGIN 
     ROLLBACK 
     RETURN 
    END 

    UPDATE tbl_user_profile 
    SET FName = @FName, LName = @LName, 
     Phone = @Phone, Email1 = @Email1, Email2 = @Email2 
    WHERE ID = @ID 

    IF @@ERROR <> 0 
    BEGIN 
     ROLLBACK 
     RETURN 
    END 

    COMMIT 

ASP.NET SqlDataSource:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
     ConnectionString="<%$ ConnectionStrings:DBConnString %>" 
     SelectCommand="SELECT tbl_user_login.ID, tbl_user_login.UserID, tbl_user_login.Pass, tbl_user_login.Enabled, tbl_user_login.Permission, tbl_user_login.Rank, tbl_user_profile.ID AS Expr1, tbl_user_profile.FName, 
tbl_user_profile.LName, tbl_user_profile.Phone, tbl_user_profile.Email1, tbl_user_profile.Email2 FROM tbl_user_login INNER JOIN tbl_user_profile ON tbl_user_login.ID = tbl_user_profile.ID" 
     UpdateCommand="UpdateTwoTable" UpdateCommandType="StoredProcedure"> 
     <UpdateParameters> 
      <asp:Parameter Name="ID" /> 
      <asp:Parameter Name="UserID"/> 
      <asp:Parameter Name="Pass"/> 
      <asp:Parameter Name="Enabled"/> 
      <asp:Parameter Name="Permission"/> 
      <asp:Parameter Name="Rank"/> 
      <asp:Parameter Name="FName"/> 
      <asp:Parameter Name="LName"/> 
      <asp:Parameter Name="Phone"/> 
      <asp:Parameter Name="Email1"/> 
      <asp:Parameter Name="Email2"/> 
     </UpdateParameters>   
    </asp:SqlDataSource> 
+0

@Abe, Nope. No funciona :( –

+0

Eche un vistazo a esto: [Cómo solucionar problemas 'Procedimiento o función tiene demasiados argumentos especificados'] (http://www.whitworth.org/2006/01/16/how-to-troubleshoot -procedure-or-function-has-too-many-arguments-specified-in-aspnet-20 /) –

+0

@JordanArron ese enlace está roto e inútil, incluso si no fuera como lo acaba de decir "Esto generalmente significa lo que dice , que su comando actualizar, eliminar o insertar está tratando de pasar más parámetros que el almacenado " – Thronk

Respuesta

9

He encontré con este mensaje de error antes cuando estaba llamando a un procedimiento almacenado desde dentro de un bucle (foreach)

La causa de la excepción que recibí se debió al hecho de que no borraba los parámetros después de cada iteración del ciclo.

Por ejemplo: Este código produce:

using (SqlCommand cmd = new SqlCommand()) 
{ 
    cmd.CommandType = System.Data.CommandType.StoredProcedure; 
    cmd.CommandText = "MySproc"; 
    foreach (MyClass c in myClasses) 
    { 
     cmd.Parameters.AddWithValue("@val1", c.val1); 
     cmd.Parameters.AddWithValue("@val2", c.val2); 
     var result = MyDbManager.instance.ExecuteScalarQuery(cmd); 
    } 
} 

La solución fue limpiar los parámetros:

using (SqlCommand cmd = new SqlCommand()) 
{ 
    cmd.CommandType = System.Data.CommandType.StoredProcedure; 
    cmd.CommandText = "MySproc"; 
    foreach (MyClass c in myClasses) 
    { 
     cmd.Parameters.AddWithValue("@val1", c.val1); 
     cmd.Parameters.AddWithValue("@val2", c.val2); 
     var result = MyDbManager.instance.ExecuteScalarQuery(cmd); 
     cmd.Parameters.Clear(); 
    } 
} 
+0

Gracias, amigo! Este problema me ha estado MATANDO! No pude entender por qué funcionó el primer ciclo, pero ninguno de los otros lo hizo. – Macromika

0

debe de ejemplo Crear

Vb.Net & C#

glopal value

vb.net -> Dim cmd as New SqlCommand() 

c#-> Sqlcommand cmd=new sqlCommand() 

Con.open() 

cmd=New SqlCommand() 

something write... 

Con.Close() 
Cuestiones relacionadas