Announcement

Collapse
No announcement yet.

Für die Prozedur oder Funktion wurden zu viele Argumente angegeb

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Für die Prozedur oder Funktion wurden zu viele Argumente angegeb

    ich fang mal an. Hab eine GridView mit "Header-Informationen". Wenn ich nen Datensatz auswähle, hätte ich gern, dass dazu dann detaillierte Informationen zu diesem Datensatz angezeigt werden. Allerdings bekomme ich immer folgende Fehlermeldung:

    Für die Prozedur oder Funktion proc_ShowTaskForCall wurden zu viele Argumente angegeben.

    Die DB Prozedur bekommt einen Input Parameter (ID) und dazu sollen dann die entsprechenden Detaildatensätze ausgegeben werden.

    Code:
    <asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource2"  
                                CellPadding="4" ForeColor="#333333" GridLines="Horizontal" BorderStyle="Groove" BorderWidth="2" BorderColor="#59A60C"  
                                DataKeyNames="SupportCallID" ShowFooter="True" 
                                OnSelectedIndexChanged="GridView2_SelectedIndexChanged" AllowPaging="True" AutoGenerateSelectButton="true">
                             <RowStyle  ForeColor="Black" />
                             <HeaderStyle BackColor="#66B849" ForeColor="White" Font-Bold="True" />
                             <AlternatingRowStyle BackColor="gray" VerticalAlign="Middle" />                      
                             <Columns>
                                  <asp:BoundField DataField="SupportCallID"  HeaderText="SupportCallID" SortExpression="SupportCallID" visible="false"/>
                                  <asp:BoundField DataField="Brief_Description" HeaderText="Brief Description" SortExpression="Brief Description" />
                                  <asp:BoundField DataField="Description" HeaderText="Description" SortExpression="Description" />
                                  <asp:BoundField DataField="COMPANYDID" HeaderText="Contact" SortExpression="Contact" />
                                  <asp:BoundField DataField="COMPANYID" HeaderText="Company" SortExpression="Company" />
                                  <asp:BoundField DataField="STATUSID" HeaderText="Status" SortExpression="Status" />
                                  <asp:BoundField DataField="PRIORITYID" HeaderText="Priority" SortExpression="Priority" />
                                  <asp:BoundField DataField="TYPEID" HeaderText="Type" SortExpression="Type" />
                                  <asp:CommandField SelectText="Select" UpdateText="Update" CancelText="Cancel" ShowEditButton="True" EditText="Edit" />
                             </Columns>                                        
                     </asp:GridView>
                     <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:scpmv3 %>"
                                SelectCommand="proc_OpenCalls" SelectCommandType="StoredProcedure"
                                UpdateCommand="update support_call
    		                                    set BRIEF_DESCRIPTION = @Brief_Description, 
    			                                Description = @Description, 
    			                                COMPANYDID = @COMPANYDID, 
    			                                COMPANYID = @COMPANYID
    		                                    where SUPPORTCALLID = @supportcallid">
                             <UpdateParameters>
                                  <asp:Parameter Name="SupportCallID" Direction="Output"/>
                             </UpdateParameters>
                     </asp:SqlDataSource>
                     <asp:Label ID="SUPPORTCALLID" runat="server" Text=""></asp:Label>
                     <asp:Label ID="SUPPORTCALLDID" runat="server" Text=""></asp:Label>
                     <asp:Label ID="ACTION" runat="server" Text=""></asp:Label>
                     <asp:Label ID="TASK_CREATED" runat="server" Text=""></asp:Label>
                     <asp:Label ID="DATE_NEXT_ACTION" runat="server" Text=""></asp:Label>
                     <asp:Label ID="CALLREMIND" runat="server" Text=""></asp:Label>
                     <asp:Label ID="MESSAGE" runat="server" Text=""></asp:Label>
    Code:
    SqlParameter SUPPORTCALLID_SQL;
        SqlParameter SUPPORTCALLDID_SQL;
        SqlParameter ACTION_SQL;
        SqlParameter TASK_CREATED_SQL;
        SqlParameter DATE_NEXT_ACTION_SQL;
        SqlParameter CALLREMIND_SQL;
        SqlParameter MESSAGE_SQL;
    
    
        protected void Page_Load(object sender, EventArgs e)
        {
            conString = "server=(local);" +
                  "Trusted_Connection=yes; database=SCPMv3";
            con = new SqlConnection(conString);
    
        }
        protected void GridView2_SelectedIndexChanged(object sender, EventArgs e)
        {
           
            int index = GridView2.SelectedIndex;
            String SUPPORTCALLID = GridView2.DataKeys[index].Value.ToString();
            getDetails(SUPPORTCALLID);
        }
        protected void getDetails(String SUPPORTCALLID)
        {
            con.Open();
            command = new SqlCommand("proc_ShowTaskForCall", con);
            command.CommandType = CommandType.StoredProcedure;
            command.Parameters.Add(new SqlParameter("@SUPPORTCALLID", SqlDbType.VarChar)).Value = SUPPORTCALLID;
    
    
            //Output-Parameters for the Detailed-View
    
            SUPPORTCALLID_SQL = command.Parameters.Add("@SUPPORTCALLID", SqlDbType.Int);
            SUPPORTCALLID_SQL.Direction = ParameterDirection.Output;
            SUPPORTCALLID_SQL.Size = 100;
    
            SUPPORTCALLDID_SQL = command.Parameters.Add("@SUPPORTCALLDID", SqlDbType.Int);
            SUPPORTCALLDID_SQL.Direction = ParameterDirection.Output;
            SUPPORTCALLDID_SQL.Size = 100;
    
            ACTION_SQL = command.Parameters.Add("@ACTION", SqlDbType.VarChar);
            ACTION_SQL.Direction = ParameterDirection.Output;
            ACTION_SQL.Size = 100;
    
            TASK_CREATED_SQL = command.Parameters.Add("@TASK_CREATED", SqlDbType.DateTime);
            TASK_CREATED_SQL.Direction = ParameterDirection.Output;
            TASK_CREATED_SQL.Size = 100;
    
            DATE_NEXT_ACTION_SQL = command.Parameters.Add("@DATE_NEXT_ACTION", SqlDbType.DateTime);
            DATE_NEXT_ACTION_SQL.Direction = ParameterDirection.Output;
            DATE_NEXT_ACTION_SQL.Size = 100;
    
            CALLREMIND_SQL = command.Parameters.Add("@CALLREMIND", SqlDbType.VarChar);
            CALLREMIND_SQL.Direction = ParameterDirection.Output;
            CALLREMIND_SQL.Size = 1;
    
            MESSAGE_SQL = command.Parameters.Add("@MESSAGE", SqlDbType.VarChar);
            MESSAGE_SQL.Direction = ParameterDirection.Output;
            MESSAGE_SQL.Size = 200;
    
            command.ExecuteNonQuery();
            con.Close();
    Hier sind mal die Codeausschnitte. Hab ich hier nen grundsätzlichen Denkfehler? Bin immer noch in der Anfangs- und Probierphase, nutze deshalb immer Codeausschnitte anderer und versuche mir daraus "meins" zu basteln

    Evtl. weiss ja jemand von euch auf Anhieb, wo ich nen Fehler gemacht habe. Aber bitte nicht gleich steinigen

  • #2
    Korrekte Patrameterübergabe

    Der Grund liegt darin, daß die SqlDataSource in ihren automatisch erstellten Befehlen Parameter für sämtliche Datenfelder der Gridview erwartet, auch wenn diese in der gespeicherten Prozedur gar nicht vorgesehen sind. Das kann man durchaus als Bug in der Befehlsgenerierung verstehen. Allerdings kann man sich im Code-Behind recht einfach helfen.

    1. Schritt: Im Updating-Ereignis der SqlDataSource die korrekten Parameter setzen.

    void SqlDataSource1_Updating(object sender, SqlDataSourceCommandEventArgs e)
    {
    e.Command.Parameters.Clear();
    e.Command.Parameters.Add(new SqlParameter("Ihr 1.Parametername ", "1"));
    e.Command.Parameters.Add(new SqlParameter("Ihr 2.Parametername", "1"));


    und so weiter...
    }

    2. Schritt: Im Updating-Ereignis der Gridview die Werte setzen
    void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
    SqlDataSource1.UpdateParameters["Ihr 1. Parametername"].DefaultValue=e.NewValues["Spaltenname"].ToString();(oder ein anderer passender Wert rechts vom Gleichheitszeichen)

    und so weiter

    Danach einfach SqlDataSource1.Update() aufrufen.

    }

    Comment

    Working...
    X