title: "Procedure or function has too many arguments specified" error when running insert query from ASP page
body: <p>I am trying to use an ASP detailsview to pass variables to an MSSQL stored procedure that then inserts values into multiple tables. The stored procedure works perfectly when I run it in SQL Management Studio. I have all of the stored procedure's variables set as parameters, yet I am still getting an error (below) when my ASP page runs. My ASP code and stored procedure are also included below the error message.</p>
  
  <p>Any help would be greatly appreciated. This problem is starting to get extremely frustrating.</p>
  
  <p><strong>Error Message:</strong></p>
  
  <pre><code>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
  </code></pre>
  
  <p><strong>ASP code:</strong></p>
  
  <pre><code>&lt;%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="AddCount.aspx.cs" Inherits="AddCountClass" Theme="ThemeMain" %&gt;
  </code></pre>
  
  <p>
  
  </p>
  
  <pre><code>&lt;asp:SqlDataSource ID="NewCount_DS" Runat="server" ProviderName="System.Data.SqlClient"
      ConnectionString="&lt;%$ ConnectionStrings:PrinterUsageConnectionString %&gt;"
      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" &gt;
      &lt;InsertParameters&gt;
          &lt;asp:Parameter Name="pName" Type="String" /&gt;
          &lt;asp:Parameter Name="dMonth" Type="Int32" /&gt;
          &lt;asp:Parameter Name="dYear" Type="Int32" /&gt;
          &lt;asp:parameter Name="count" Type="Int32" /&gt;
          &lt;asp:parameter Name="dID" Type="Int32" DefaultValue="0" /&gt;
          &lt;asp:parameter Name="prevMonth_dID" Type="Int32" DefaultValue="0" /&gt;
          &lt;asp:parameter Name="pID" Type="Int32" DefaultValue="0" /&gt;
          &lt;asp:Parameter Name="monthUsage" Type="Int32" DefaultValue="0" /&gt;
      &lt;/InsertParameters&gt;
  &lt;/asp:SqlDataSource&gt;
  
  &lt;asp:SqlDataSource ID="pName_DS" runat="server" ProviderName="System.Data.SqlClient"
  ConnectionString="&lt;%$ ConnectionStrings:PrinterUsageConnectionString %&gt;"
  DataSourceMode="DataReader" SelectCommandType="StoredProcedure" SelectCommand="Get_pNames" /&gt;
  
      &lt;asp:DetailsView ID="AddPrinter_DV" runat="server" AutoGenerateInsertButton="True"
          AutoGenerateRows="False" DataSourceID="NewCount_DS" 
          EnableModelValidation="True" DefaultMode="Insert" SkinID="detailsviewSkin" &gt;
  
          &lt;Fields&gt;
              &lt;asp:TemplateField HeaderText="Printer Name:" SortExpression="pName" &gt;
                  &lt;InsertItemTemplate&gt;
                      &lt;asp:DropDownList ID="pNameDropdown" runat="server" DataSourceID="pName_DS"
                          DataValueField="pName" DataTextField="pName" /&gt;
                  &lt;/InsertItemTemplate&gt;
              &lt;/asp:TemplateField&gt;
              &lt;asp:BoundField DataField="dMonth" HeaderText="Month" 
                  SortExpression="dMonth"  /&gt;
              &lt;asp:BoundField DataField="dYear" HeaderText="Year" SortExpression="dYear" /&gt;
              &lt;asp:BoundField DataField="countYtD" HeaderText="Count" 
                  SortExpression="countYtD" /&gt;
          &lt;/Fields&gt;
  
       &lt;/asp:DetailsView&gt;
  
  &lt;/asp:Content&gt;
  </code></pre>
  
  <p><strong>SQL Stored Procedure:</strong></p>
  
  <pre><code>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
  </code></pre>