“La procedura o la funzione ha troppi argomenti specificati” Ma non è così

Grazie in anticipo per il tuo aiuto. È molto apprezzato

Dopo due lunghe ore di purga Stack Overflow e altri risultati di Google per il motivo che sto ricevendo una “Procedura o Funzione ha specificato troppi argomenti”, non ho trovato alcun aiuto utile. La ragione di ciò è che ovunque, ho letto che probabilmente ho troppi argomenti specificati, i nomi errati per i miei argomenti o i tipi errati. Nessuno di questi è vero per il mio caso. Ecco il mio codice:

CREATE PROCEDURE dbo.sproc_UpdateInfo ( @Name nvarchar(40), @UserId varchar(50), @Password varchar(50), @Address nvarchar(120) ) AS Update tbl_Users SET Name=@Name, Password=@Password, Address=@Address WHERE UserId=@UserId RETURN 

Ed ecco il lato C # delle cose:

 SqlCommand sqlCmd = new SqlCommand(); sqlCmd.CommandText = "sproc_UpdateInfo"; sqlCmd.CommandType = CommandType.StoredProcedure; sqlCmd.Parameters.Add("@Name", SqlDbType.NVarChar, 40).Value = name; sqlCmd.Parameters.Add("@UserId", SqlDbType.VarChar, 50).Value = userID; sqlCmd.Parameters.Add("@Password", SqlDbType.VarChar, 50).Value = password; sqlCmd.Parameters.Add("@Address", SqlDbType.NVarChar, 120).Value = address; SqlConnection sqlConn = new SqlConnection(connectionString); sqlCmd.Connection = sqlConn; try { sqlCmd.Connection.Open(); int rowaffected = sqlCmd.ExecuteNonQuery(); //Error occurs here return rowaffected; } catch (SqlException se) { throw new Exception("SqlException: sqlstr=" + sqlCmd.CommandText, se); } finally { sqlCmd.Dispose(); sqlConn.Close(); } 

Passa a questo e dimmi se l’errore scompare …

 sqlCmd.Parameters.Add("@Name", SqlDbType.NVarChar, 40).Value = name ?? ""; sqlCmd.Parameters.Add("@UserId", SqlDbType.VarChar, 50).Value = userID ?? ""; sqlCmd.Parameters.Add("@Password", SqlDbType.VarChar, 50).Value = password ?? ""; sqlCmd.Parameters.Add("@Address", SqlDbType.NVarChar, 120).Value = address ?? ""; 

Inoltre, eseguire una traccia sul server quando si esegue la query dal codice: (ecco come: http://databases.about.com/od/sqlserver/ht/trace.htm )

Dicci quali sono i risultati dell’esecuzione (come viene effettivamente eseguito il tuo sproc) e se viene chiamato.

Non c’è magia qui. Solo poche cose potrebbero andare avanti:

Non stai eseguendo la stessa versione dello sproc che pensi di essere o connesso al DB o al server sbagliato. Controlla lo schema della sproc. Sei sicuro che lo sproc che stai eseguendo sia dbo. e non c’è un’altra versione di esso con meno parametri che non è dbo? Questo mi ha ottenuto un paio di volte. Cambierò / creerò accidentalmente uno sproc sotto lo schema sbagliato e quando il mio codice non specifica quale schema, quello che è il default per il mio utente che sto effettuando l’accesso come invece verrà eseguito. Davvero, devi eseguire una traccia. Questo è il guaio di base per cose come questa. È necessario vedere effettivamente cosa sta tentando di eseguire SQL. Copia / incolla il codice nella sezione commenti qui. Questo codice ti dà lo stesso errore? Scommetto che questa è una confusione dello schema e hai più versioni. Sembra maleducato dire, ma o quello o non sei sullo stesso server / db che pensi di essere. Succede al meglio di noi! 🙂

Un’altra cosa potrebbe accadere. Esiste una versione di quello sproc nel master db? Se è così, tieni presente che verrà eseguito e non qualsiasi cosa tu abbia nel DB a cui sei connesso. Controllare il DB principale. Se lo hai creato lì e ha meno parametri, questo potrebbe essere il tuo problema.

L’errore è in realtà fuorviante e errato.

la procedura o la funzione ha troppi argomenti specificati

Il vero problema è selezionare e aggiornare le stored procedure devono avere gli stessi parametri , altrimenti si otterrà questo errore. Davvero non intuitivo, tipico di Microsoft, credo.

Nel mio caso, stavo apportando modifiche a un progetto WebForms che non era stato modificato per oltre 4 anni.

Stavo apportando modifiche ai progetti di database in Visual Studio: inserisci la descrizione dell'immagine qui

Ma le modifiche in realtà dovevano essere apportate all’interno di SQL Server Manager Studio: inserisci la descrizione dell'immagine qui

E poi eseguito in SQL Server Manager Studio!