0
votes

Whenever I try to insert something into my database, I get this error:

Procedure or function sp_Customer_Insert has too many arguments specified.

Tried to search for help online but couldn't find anything helpful.

EDIT: I deleted p_cust_id from insert parameters, but it still gives the same error, help please I really don't see what I'm doing wrong

Stored procedure:

ALTER PROCEDURE [dbo].[sp_Customer_Insert]
 @p_cust_name nvarchar(50)
,@p_cust_address nvarchar(50)
,@p_cust_city nvarchar(50)
,@p_cust_state nvarchar(5)
,@p_cust_zip nvarchar(10)
,@p_cust_country nvarchar(50)
,@p_cust_contact nvarchar(50)
,@p_cust_email  nvarchar(255)
,@p_cust_birthday datetime
AS
BEGIN

INSERT INTO customers
       (cust_name
       ,cust_address
       ,cust_city
       ,cust_state
       ,cust_zip
       ,cust_country
       ,cust_contact
       ,cust_email
       ,cust_birthday)
 VALUES
       (@p_cust_name
       ,@p_cust_address
       ,@p_cust_city 
       ,@p_cust_state
       ,@p_cust_zip
       ,@p_cust_country
       ,@p_cust_contact
       ,@p_cust_email
       ,@p_cust_birthday
       );
END;

ASP code:

<asp:DetailsView ID="DetailsView1" runat="server" DataSourceID="SqlDataSource1" Height="50px" Width="223px" AutoGenerateRows="False" DataKeyNames="cust_id">
        <Fields>
            <asp:BoundField DataField="cust_id" HeaderText="cust_id" InsertVisible="False" ReadOnly="True" SortExpression="cust_id" />
            <asp:BoundField DataField="cust_name" HeaderText="cust_name" SortExpression="cust_name" />
            <asp:BoundField DataField="cust_address" HeaderText="cust_address" SortExpression="cust_address" />
            <asp:BoundField DataField="cust_city" HeaderText="cust_city" SortExpression="cust_city" />
            <asp:BoundField DataField="cust_state" HeaderText="cust_state" SortExpression="cust_state" />
            <asp:BoundField DataField="cust_zip" HeaderText="cust_zip" SortExpression="cust_zip" />
            <asp:BoundField DataField="cust_country" HeaderText="cust_country" SortExpression="cust_country" />
            <asp:BoundField DataField="cust_contact" HeaderText="cust_contact" SortExpression="cust_contact" />
            <asp:BoundField DataField="cust_email" HeaderText="cust_email" SortExpression="cust_email" />
            <asp:BoundField DataField="cust_birthday" HeaderText="cust_birthday" SortExpression="cust_birthday" />
            <asp:CommandField ShowInsertButton="True" />
        </Fields>
    </asp:DetailsView>
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:CrashCourseConnectionString %>" InsertCommand="sp_Customer_Insert" InsertCommandType="StoredProcedure" SelectCommand="sp_CustomerByID" SelectCommandType="StoredProcedure">
        <InsertParameters>
            <asp:Parameter Name="p_cust_name" Type="String" />
            <asp:Parameter Name="p_cust_address" Type="String" />
            <asp:Parameter Name="p_cust_city" Type="String" />
            <asp:Parameter Name="p_cust_state" Type="String" />
            <asp:Parameter Name="p_cust_zip" Type="String" />
            <asp:Parameter Name="p_cust_country" Type="String" />
            <asp:Parameter Name="p_cust_contact" Type="String" />
            <asp:Parameter Name="p_cust_email" Type="String" />
            <asp:Parameter Name="p_cust_birthday" Type="DateTime" />
        </InsertParameters>
        <SelectParameters>
            <asp:ControlParameter ControlID="ddlCustomers" Name="cust_id" PropertyName="SelectedValue" Type="Int32" />
        </SelectParameters>
    </asp:SqlDataSource>

C#

public static DataTable InsertCustomer(string Name, string Address, string City, string State, string Zip, string Country, string Contact, string Email, DateTime BDay)
{
        DataTable DT = new DataTable();

        SqlDataAdapter DA = new SqlDataAdapter("sp_Customer_Insert", CData.CData.GetConnection());

        DA.SelectCommand.CommandType = CommandType.StoredProcedure;

        DA.SelectCommand.Parameters.AddWithValue("@p_cust_name", Name);
        DA.SelectCommand.Parameters.AddWithValue("@p_cust_address", Address);
        DA.SelectCommand.Parameters.AddWithValue("@p_cust_city", City);
        DA.SelectCommand.Parameters.AddWithValue("@p_cust_state", State);
        DA.SelectCommand.Parameters.AddWithValue("@p_cust_zip", Zip);
        DA.SelectCommand.Parameters.AddWithValue("@p_cust_country", Country);
        DA.SelectCommand.Parameters.AddWithValue("@p_cust_contact", Contact);
        DA.SelectCommand.Parameters.AddWithValue("@p_cust_email", Email);
        DA.SelectCommand.Parameters.AddWithValue("@p_cust_birthday", BDay);

        return DT;

Can someone help?

I don't see what I'm doing wrong.

4
You can't use // to comment in aspx code. Use <!-- <asp:Parameter Name="p_cust_id" Type="Int32" /> --> instead, or just delete the line since it's not needed anyway. - ekad
I deleted it completely. Still the same error - user2287508
Side note: you should not use the sp_ prefix for your stored procedures. Microsoft has reserved that prefix for its own use (see Naming Stored Procedures), and you do run the risk of a name clash sometime in the future. It's also bad for your stored procedure performance. It's best to just simply avoid sp_ and use something else as a prefix - or no prefix at all! - marc_s
Not clear what the InsertCustomer method is doing. For insert SP, you are adding SelectCommand.Parameters instead of InsertCommand.Parameters, and not inserting at last. Creating null DataTable and returning it. Are you really using this? - afzalulh

4 Answers

2
votes

We get this error when we try to insert more parameters than we have defined

As in your .aspx page code in you have defined one extra parameter i.e

<asp:Parameter Name="p_cust_id" Type="Int32" />

Remove this line as you are not inserting id field.

2
votes

Since there's no @p_cust_id parameter in sp_Customer_Insert, you need to remove <asp:Parameter Name="p_cust_id" Type="Int32" /> from <InsertParameters>:

<InsertParameters>
    <asp:Parameter Name="p_cust_name" Type="String" />
    <asp:Parameter Name="p_cust_address" Type="String" />
    <asp:Parameter Name="p_cust_city" Type="String" />
    <asp:Parameter Name="p_cust_state" Type="String" />
    <asp:Parameter Name="p_cust_zip" Type="String" />
    <asp:Parameter Name="p_cust_country" Type="String" />
    <asp:Parameter Name="p_cust_contact" Type="String" />
    <asp:Parameter Name="p_cust_email" Type="String" />
    <asp:Parameter Name="p_cust_birthday" Type="DateTime" />
</InsertParameters>
1
votes

You need to delete <asp:Parameter Name="p_cust_id" Type="Int32" /> from <InsertParameters> in your ASP file

0
votes

I had a similar problem which turned out to be due to the use of a DataKeyName which was not used as a parameter to my (Update) Stored Procedure. It seemed to be included with the update parameters collection although I could not find any documentation to explain why. I corrected the problem at the time by adding the DataKey as an (unused) parameter in the Stored Procedure. I did not need to add to the updateParameters collection.

This was just a temporary fix to test if this would resolve the issue - in the end I recoded the page so I did not use a DataKey.

In this instance I would try adding a declaration of cust_id to sp_Customer_Insert.