«В процедуре или функции указано слишком много аргументов» при запуске вставки запроса из страницы ASP

Вопрос: Я пытаюсь использовать представление ASP для передачи переменных в хранимую процедуру MSSQL, которая затем вставляет значения в несколько таблиц. Хранимая процедура отлично работает, когда я запускаю ее в SQL Management Studio. У меня есть все переменные хранимой процедуры, заданные как параметры, но я все еще получаю сообщение об ошибке (ниже), когда выполняется моя страница

Вопрос:

Я пытаюсь использовать представление ASP для передачи переменных в хранимую процедуру MSSQL, которая затем вставляет значения в несколько таблиц. Хранимая процедура отлично работает, когда я запускаю ее в SQL Management Studio. У меня есть все переменные хранимой процедуры, заданные как параметры, но я все еще получаю сообщение об ошибке (ниже), когда выполняется моя страница ASP. Мой код ASP и хранимая процедура также включены ниже сообщения об ошибке.

Любая помощь будет принята с благодарностью. Эта проблема начинает очень расстраивать.

Сообщение об ошибке:

Server Error in ‘/PrinterUsage’ Application. Procedure or function Add_Count_By_Name has too many arguments specified. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Exception Details: System.Data.SqlClient.SqlException: Procedure or function Add_Count_By_Name has too many arguments specified. Source Error: An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below. Stack Trace: [SqlException (0x80131904): Procedure or function Add_Count_By_Name has too many arguments specified.] System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) +1950522 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) +4856715 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) +194 System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +1121 System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +200 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +954 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +162 System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe) +175 System.Data.SqlClient.SqlCommand.ExecuteNonQuery() +137 System.Web.UI.WebControls.SqlDataSourceView.ExecuteDbCommand(DbCommand command, DataSourceOperation operation) +386 System.Web.UI.WebControls.SqlDataSourceView.ExecuteInsert(IDictionary values) +227 System.Web.UI.DataSourceView.Insert(IDictionary values, DataSourceViewOperationCallback callback) +86 System.Web.UI.WebControls.DetailsView.HandleInsert(String commandArg, Boolean causesValidation) +274 System.Web.UI.WebControls.DetailsView.HandleEvent(EventArgs e, Boolean causesValidation, String validationGroup) +676 System.Web.UI.WebControls.DetailsView.OnBubbleEvent(Object source, EventArgs e) +95 System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37 System.Web.UI.WebControls.DetailsViewRow.OnBubbleEvent(Object source, EventArgs e) +113 System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37 System.Web.UI.WebControls.LinkButton.OnCommand(CommandEventArgs e) +118 System.Web.UI.WebControls.LinkButton.RaisePostBackEvent(String eventArgument) +135 System.Web.UI.WebControls.LinkButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10 System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +175 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565 Version Information: Microsoft .NET Framework Version:2.0.50727.5448; ASP.NET Version:2.0.50727.5456

Код ASP:

<%@ Page Title=»» Language=»C#» MasterPageFile=»~/MasterPage.master» AutoEventWireup=»true» CodeFile=»AddCount.aspx.cs» Inherits=»AddCountClass» Theme=»ThemeMain» %> <asp:SqlDataSource ID=»NewCount_DS» Runat=»server» ProviderName=»System.Data.SqlClient» ConnectionString=»<%$ ConnectionStrings:PrinterUsageConnectionString %>» DataSourceMode=»DataReader» InsertCommandType=»StoredProcedure» InsertCommand=»Add_Count_By_Name» DeleteCommand=»Add_Count_By_ID» DeleteCommandType=»StoredProcedure» SelectCommand=»Get_Count_By_PrinterID» SelectCommandType=»StoredProcedure» UpdateCommand=»Edit_Count_By_ID» UpdateCommandType=»StoredProcedure» > <InsertParameters> <asp:Parameter Name=»pName» Type=»String» /> <asp:Parameter Name=»dMonth» Type=»Int32″ /> <asp:Parameter Name=»dYear» Type=»Int32″ /> <asp:parameter Name=»count» Type=»Int32″ /> <asp:parameter Name=»dID» Type=»Int32″ DefaultValue=»0″ /> <asp:parameter Name=»prevMonth_dID» Type=»Int32″ DefaultValue=»0″ /> <asp:parameter Name=»pID» Type=»Int32″ DefaultValue=»0″ /> <asp:Parameter Name=»monthUsage» Type=»Int32″ DefaultValue=»0″ /> </InsertParameters> </asp:SqlDataSource> <asp:SqlDataSource ID=»pName_DS» runat=»server» ProviderName=»System.Data.SqlClient» ConnectionString=»<%$ ConnectionStrings:PrinterUsageConnectionString %>» DataSourceMode=»DataReader» SelectCommandType=»StoredProcedure» SelectCommand=»Get_pNames» /> <asp:DetailsView ID=»AddPrinter_DV» runat=»server» AutoGenerateInsertButton=»True» AutoGenerateRows=»False» DataSourceID=»NewCount_DS» EnableModelValidation=»True» DefaultMode=»Insert» SkinID=»detailsviewSkin» > <Fields> <asp:TemplateField HeaderText=»Printer Name:» SortExpression=»pName» > <InsertItemTemplate> <asp:DropDownList ID=»pNameDropdown» runat=»server» DataSourceID=»pName_DS» DataValueField=»pName» DataTextField=»pName» /> </InsertItemTemplate> </asp:TemplateField> <asp:BoundField DataField=»dMonth» HeaderText=»Month» SortExpression=»dMonth» /> <asp:BoundField DataField=»dYear» HeaderText=»Year» SortExpression=»dYear» /> <asp:BoundField DataField=»countYtD» HeaderText=»Count» SortExpression=»countYtD» /> </Fields> </asp:DetailsView> </asp:Content>

Сохраненная процедура SQL:

ALTER PROCEDURE [dbo].[Add_Count_By_Name] —Declare variables @pName NVARCHAR(100), @dMonth INT, @dYear INT, @count INT, @dID INT, @prevMonth_dID INT, @pID INT, @monthUsage INT AS BEGIN —set variables SET @dID = NULL SET @prevMonth_dID = NULL SET @pID = NULL SET @monthUsage = NULL —check if the printer has been added to the system —if the printer is in the system, then save the pID to @pID —if the printer is not in the system, display error msg and stop stored procedure IF EXISTS (SELECT pID FROM PrinterTbl WHERE [email protected]) BEGIN SELECT @pID = pID FROM PrinterTbl WHERE [email protected]; END ELSE BEGIN PRINT ‘Printer name not found. Please verify that the printer has been added to the system’; RETURN 1; END —Check if the date has been added to the system —if date is in the system, save dID to @dID —if date is not in the system, add it to the system IF EXISTS (SELECT dId FROM DatesTbl WHERE [email protected] AND [email protected]) BEGIN SELECT @dID = dId FROM DatesTbl WHERE [email protected] AND [email protected]; END ELSE BEGIN INSERT INTO DatesTbl (dMonth, dYear) VALUES (@dMonth, @dYear); SELECT @dID = dId FROM DatesTbl WHERE [email protected] AND [email protected]; END —Verify that neither @pID or @dID contain a null value, —then calculate the monthly usage and add the new count to CountTbl IF @pID IS NOT NULL AND @dID IS NOT NULL BEGIN —if the count is being added for January, manually set the month to December —and subtract 1 from the year to obtain dID of December of the previous year. —if adding a count for any month other than January, subtract 1 from @dMonth —to obtain @prevMonth_dID IF @dMonth = 1 BEGIN SELECT @prevMonth_dID = dID FROM DatesTbl WHERE dMonth=12 AND dYear=(@dYear-1); END ELSE BEGIN SELECT @prevMonth_dID = (@dID-1); END —subtract the countYtd value from the previous month from the newly entered YtD count —to obtain the monthly usage for the printer. SELECT @monthUsage = @count — (SELECT countYtD FROM CountTbl WHERE dID = @prevMonth_dID); —insert the new count record into CountTbl INSERT INTO CountTbl (pID, dID, monthUsage, countYtD) VALUES (@pID, @dID, @monthUsage, @count); END END Лучший ответ:

Думаю, я стреляю в темноту здесь, но это поле вызывает проблемы?

<asp:BoundField DataField=»countYtD» HeaderText=»Count» SortExpression=»countYtD» />

DataSource count как параметр, а также хранимая процедура. Поле countYtD не существует, поэтому я думаю, что это будет добавлено автоматически, потому что это поле Bound.

Ответ №1 <asp:BoundField DataField=»countYtD» HeaderText=»Count» SortExpression=»countYtD» />

Это связанное поле будет добавлено в качестве параметра хранимой процедуры и не будет принадлежать списку параметров. Попробуйте, если возможно, преобразовать его в TemplateField и использовать Eval вместо Bind.

Ответ №2

Да, я испытал ту же ошибку при вызове метода обновления источника данных для gridview.

Источник данных называется хранимой процедурой для выполнения обновления базы данных.

Я исправил проблему следующим образом:

Во-первых, убедитесь, что вы указали все свои параметры SP в источнике данных, включите DataKeys в SP.

Во-вторых, все поля, которые вы хотите редактировать, связаны с помощью <%# Bind(«some Field») %>. НЕ свяжите другие поля с командой SELECT. EVAL() этого используйте EVAL().

В-третьих, имена параметров UPDATE MUST MATCH имена любых значений BIND(). И ВСЕ параметры обновления должны быть привязаны к элементу управления ввода (текстовое поле и т.д.).

Когда вызывается метод Data Source Update(), он будет анализировать данные обратной передачи и искать все значения BIND(). Эти значения ДОЛЖНЫ соответствовать ИМЯМ, определенным в определениях параметров обновления.

Например, у меня есть столбец. Он имеет как определение <ItemTemplate> и <EditItemTemplate>. В <ItemTemplate>, я Eval() имя столбца SELECTED,

<ItemTemplate> <%# Eval(«LastName») %> </ItemTemplate>

В <EditTemplate> я объявил элемент управления <asp:textbox> чтобы получить значение “FirstName” из команды SELECT.

<EditItemTemplate> <asp:TextBox ID=»tbFirstName» runat=»server» text='<%# Bind(«FirstName») %>’></asp:textbox> </EditItemTemplate>

В параметрах UPDATE источника данных я определил этот параметр

<UpdateParameters> <asp:parameter Name=»FirstName» DbType=»String» DefaultValue=»» /> </UpdateParameters>

Теперь, когда страница будет отправлена обратно, страница будет проанализирована, и значения для всех параметров UPDATE будут предоставлены из элементов управления, значениями которых были BIND() с тем же именем параметра UPDATE.

Любое несоответствие либо написанию имен параметров, либо любой EXTRA BIND() для значений, не включенных в параметры UPDATE приведет к ошибке “Слишком много параметров”.

Оцените статью
Добавить комментарий