Ошибка «Процедура или функция имеет слишком много аргументов» при запуске запроса вставки со страницы ASP - PullRequest
3 голосов
/ 13 марта 2012

Я пытаюсь использовать подробное представление 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 pName=@pName)
    BEGIN
        SELECT @pID = pID FROM PrinterTbl WHERE pName=@pName;
    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 dMonth=@dMonth AND dYear=@dYear)
    BEGIN
        SELECT @dID = dId FROM DatesTbl WHERE dMonth=@dMonth AND dYear=@dYear;
    END
ELSE
    BEGIN
        INSERT INTO DatesTbl (dMonth, dYear)
        VALUES (@dMonth, @dYear);
        SELECT @dID = dId FROM DatesTbl WHERE dMonth=@dMonth AND dYear=@dYear;
    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

Ответы [ 3 ]

7 голосов
/ 13 марта 2012
 <asp:BoundField DataField="countYtD" HeaderText="Count" 
                SortExpression="countYtD" />

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

5 голосов
/ 13 марта 2012

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

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

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

3 голосов
/ 11 июля 2012

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

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

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

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

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

В-третьих, имена UPDATE Параметры ДОЛЖНЫ СООТВЕТСТВОВАТЬ именам любых значений BIND().И ВСЕ параметры обновления должны быть СВЯЗАНЫ с элементом управления вводом (текстовое поле и т. Д.).

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

Например, у меня есть столбец.Он имеет определение <ItemTemplate> и <EditItemTemplate><ItemTemplate>, I 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, возникнет ошибка «Слишком много параметров».

...