Процедура или функция имеет слишком много аргументов указанная ошибка
Я никак не мог найти ошибку в своем коде. Я снова и снова пересчитывал все переменные.
язык SQL:
ALTER PROCEDURE [dbo].[sp_AdminSite_ReferrerDAL_SaveUpdateReferrer] @iReferrerID INT, @tFirstName varchar(50), @tLastName varchar(50), @tAddress varchar(50), @tCity varchar(50), @tState varchar(50), @tZipCode varchar(50), @tPhoneNo varchar(50), @tEmail varchar(50), @iRMID INT, @iCompID INT, @bReferreStatus Bit, @xmlADD XML, @retVal INT OUTPUT, @xmlDEL XML, @bIsEdit Bit AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. DECLARE @iReferrerID_ numeric(18, 0); SET NOCOUNT ON; -- Insert Referrer for procedure here -- Insert to Referrer IF(@bIsEdit = 0) BEGIN INSERT INTO tblReferrer ( tFirstName, tLastName, tAddress, tCity, tState, tZipCode, tPhoneNumber, tEmail, dDateCreated, iRMID, iCompID, bReferrerStatus ) VALUES( @tFirstName, @tLastName, @tAddress, @tCity, @tState, @tZipCode, @tPhoneNo, @tEmail, GETDATE(), @iRMID, @iCompID, @bReferreStatus ); -- Insert to tblReferrerLocationJunction SET @iReferrerID_ = (SELECT SCOPE_IDENTITY() ); SET @retVal = @iReferrerID_; INSERT INTO tblReferrerLocationJunction ( iReferrerID, iLocationID ) SELECT @iReferrerID_, Locations.value('@Id','INT') AS iLocationID FROM @xmlADD.nodes('/locations/location') AS TEMPTABLE(Locations); END ELSE --for saving edited BEGIN DECLARE @tmpRefID INT = 0; SELECT @tmpRefID = iReferrerID FROM tblReferrer WHERE tFirstName=@tFirstName AND tLastName =@tLastName AND tAddress =@taddress AND tCity=@tCity AND tState=@tState AND tZipCode=@tZipCode AND tPhoneNumber=@tPhoneNo AND tEmail=@tEmail AND iRMID= @iRMID AND iCompID = @iCompID AND bReferrerStatus =@bReferreStatus AND iReferrerID = @iReferrerID; IF @tmpRefID = 0 BEGIN UPDATE tblReferrer SET tFirstName=@tFirstName, tLastName =@tLastName, tAddress =@taddress, tCity=@tCity, tState=@tState, tZipCode=@tZipCode, tPhoneNumber=@tPhoneNo, tEmail=@tEmail, iRMID= @iRMID, iCompID = @iCompID, bReferrerStatus =@bReferreStatus WHERE iReferrerID = @iReferrerID; END IF OBJECT_ID('tempdb..#tmpReferrerLocation') IS NOT NULL DROP TABLE #tmpReferrerLocation CREATE TABLE #tmpReferrerLocation ( iLocationID INT); INSERT INTO #tmpReferrerLocation SELECT Locations.value('@Id','INT') AS iLocationID FROM @xmlADD.nodes('/locations/location') AS TEMPTABLE(Locations) -- delete from junction --DELETE DELETE FROM tblReferrerLocationJunction WHERE iReferrerID = @iReferrerID AND iLocationID NOT IN( SELECT iLocationID FROM #tmpReferrerLocation); -- insert to junction INSERT INTO tblReferrerLocationJunction ( iReferrerID, iLocationID) SELECT @iReferrerID, T.iLocationID FROM #tmpReferrerLocation T WHERE T.iLocationID NOT IN ( SELECT iLocationID FROM tblReferrerLocationJunction WHERE iReferrerID = @iReferrerID ) DROP TABLE #tmpReferrerLocation; SET @retVal = @iReferrerID; END END
Код C# Позади:
public static int SaveReferrer(int _referrerId, string _lastName, string _firstName, string _address, string _city, string _state, string _zipCode, string _phone, string _email, int _adminID, int _companyID, int _referrerStatus, XmlDocument _xmlDoc, XmlDocument _xmlDel, int _isEdit) { int iReferrerId = 0; try { SqlParameter[] arParams = new SqlParameter[16]; arParams[0] = new SqlParameter("@iReferrerID", _referrerId); arParams[1] = new SqlParameter("@tFirstName", _firstName); arParams[2] = new SqlParameter("@tLastName", _lastName); arParams[3] = new SqlParameter("@tAddress", _address); arParams[4] = new SqlParameter("@tCity", _city); arParams[5] = new SqlParameter("@tState", _state); arParams[6] = new SqlParameter("@tZipCode", _zipCode); arParams[7] = new SqlParameter("@tPhoneNo", _phone); arParams[8] = new SqlParameter("@tEmail", _email); arParams[9] = new SqlParameter("@iRMID", _adminID); arParams[10] = new SqlParameter("@iCompID", _companyID); arParams[11] = new SqlParameter("@bReferreStatus", _referrerStatus); arParams[12] = new SqlParameter("@xmlADD", SqlDbType.Xml) { Value = new SqlXml(new XmlTextReader(_xmlDoc.InnerXml, XmlNodeType.Document, null)) }; arParams[13] = new SqlParameter("@retVal", SqlDbType.Int, 11); arParams[13].Direction = ParameterDirection.Output; arParams[14] = new SqlParameter("@xmlDEL", SqlDbType.Xml) { Value = new SqlXml(new XmlTextReader(_xmlDel.InnerXml, XmlNodeType.Document, null)) }; arParams[15] = new SqlParameter("@bIsEdit", _isEdit); SqlHelper.ExecuteNonQuery(connectionString, CommandType.StoredProcedure, "[sp_AdminSite_ReferrerDAL_SaveUpdateReferrer]", arParams ); //The error always happens here. iReferrerId = Convert.ToInt32(arParams[13].Value.ToString()); } catch { throw; } return iReferrerId; }
Я попытался найти решения, но все, что я нашел, были запросы, а не хранимые процедуры.
Что я уже пробовал:
sql-процедура или функция !!! имеет слишком много аргументов-переполнение стека[^]
c# - "процедура или функция имеет слишком много заданных аргументов", но это не так - переполнение стека[^]
[Решена]процедура или функция имеет слишком много аргументов.-VBForums[^]
Garth J Lancaster
ну, до сих пор я, вероятно, делал то же самое, что и вы, считал их, "ТИК", сравнивал имя параметра символ за символом, "ТИК"....
это может не иметь никакого значения, но нигде в вашей хранимой процедуре я не вижу, чтобы вы действительно делали
возвращение @retVal
вы "поставили" его дважды ... кроме этого, я все еще думаю
Karthik_Mahalingam
проверил ваш код, кажется, все в порядке..
может быть, какая-то ошибка в SqlHelper.Метод ExecuteNonQuery ()..
опубликуйте код метода..
Garth J Lancaster
здесь есть пример, который не имеет серьезных отличий от вашего кода, которые я вижу https://www.codeproject.com/articles/748619/ado-net-how-to-call-a-stored-procedure-with-output
Karthik_Mahalingam
не удалось воспроизвести ошибку..
ОП чего-то не хватает.
Garth J Lancaster
"фу" - иногда мы просто летим вслепую !
Karthik_Mahalingam
:-)
NightWizzard
Может быть, одно из ваших значений параметра содержит запятую, и результирующий SQL приведет к чему-то, что выглядит как дополнительный параметр? В этом случае убедитесь, что десятичные точки в числовых параметрах представлены точкой, а не запятой.