Prozedur oder Funktion 'xyz' hat zu viele Argumente angegeben

Ich kenne diese Art von Frage gestellt wurde, mindestens ein Dutzend mal auf, aber ich bin gegangen durch all die vorhergehenden Fragen und Antworten konnte ich hier finden, und keine, die ich gefunden habe, gelten. Ich bin mit mehreren FormView-Objekte auf meiner Seite, und jetzt wollen Sie, um die option zu Bearbeiten, einer von Ihnen. Das FormView ist bevölkert von SqlDataSource verbunden mit einer gespeicherten Prozedur, also machte ich eine gespeicherte Prozedur zum aktualisieren der Aufzeichnungen und fügte hinzu, es zu dem SqlDataSource, die nun wie folgt aussieht:

<asp:SqlDataSource ID="TestSqlDataSource" runat="server" 
                   SelectCommandType="StoredProcedure" 
                   ConnectionString="<%$ ConnectionStrings:development %>" 
                   SelectCommand="usp_GetNewTestDetails" 
                   UpdateCommand="usp_UpdateTest" 
                   UpdateCommandType="StoredProcedure" 
                   onupdating="TestSqlDataSource_Updating">
    <SelectParameters>
        <asp:SessionParameter SessionField="TestID" Name="TestID"/>
    </SelectParameters>
    <UpdateParameters>
        <asp:Parameter Name="testId" Type="Int32"/>
        <asp:Parameter Name="testerLicense" Type="Int32" />
        <asp:Parameter Name="premiseOwner" Type="String" />
        <asp:Parameter Name="premiseAddress" Type="String" />
        <asp:Parameter Name="premiseCity" Type="String" />
        <asp:Parameter Name="premiseState" Type="String" />
        <asp:Parameter Name="premiseZip" Type="String" />
        <asp:Parameter Name="protectionType" Type="String" />
        <asp:Parameter Name="testType" Type="String" />
        <asp:Parameter Name="repairs" Type="String" />
        <asp:Parameter Name="notes" Type="String" />
        <asp:Parameter Name="testDate" Type="DateTime" />
        <asp:Parameter Name="employerName" Type="String" />
        <asp:Parameter Name="employerAddress" Type="String" />
        <asp:Parameter Name="phoneNumber" Type="String" />
        <asp:Parameter Name="emailAddress" Type="String" />
        <asp:Parameter Name="dataEntryName" Type="String" />
        <asp:Parameter Name="dataEntryPhone" Type="String" />
        <asp:Parameter Name="signature" Type="String" />
        <asp:Parameter Name="entryDate" Type="DateTime" />
    </UpdateParameters>
</asp:SqlDataSource>

Wenn ich versuche, einen Datensatz zu aktualisieren, ich erhalte eine Fehlermeldung, die sagt, es gibt zu viele Parameter in meiner Abfrage. Ich habe dreifach geprüft, dass die Parameter in meinem code exakt übereinstimmen (name, Nummer, und sogar die Reihenfolge) diejenigen, die in meinen gespeicherten Prozedur.

In dem Versuch, Antworten zu finden, stieß ich auf dieser Beitrag die verwiesen wird, diese Website (hatte zu gehen, um archive.org da die ursprüngliche zu sein scheint down). Ich bewarb mich, was Sie vorgeschlagen, um die Parameter der trace Funktion. Was ich fand, war, dass in meinem gespeicherte Prozedur, es gibt ein paar "lookup" - Werte aus der select-Verfahren, die nicht in der update-Prozedur. Die Tabelle ich bin versucht, zu aktualisieren, hat nur die ID des Testers, aber der Benutzer möchte, um zu sehen, Ihren Namen, so dass es Referenzen, die Tabelle, aber in der Formularansicht die Felder sind schreibgeschützt, während edit-Modus, so dass Sie nicht versuchen, es zu ändern. Alle anderen Parameter line up... nur die lookup-Werte sind "off".

Dachte ich, dass durch die Einbeziehung der spezifischen Liste von Parametern zu übergeben, es würde nur verwenden Sie diese Parameter, aber das scheint falsch zu sein. Jetzt bin ich ratlos, da ich bereits angegeben haben, die Parameter, und ich kann nicht finden Sie irgendwo, dass Sie überschrieben mit denen aus der wählen Sie die gespeicherte Prozedur. Wo kann ich sagen, es nicht zu verwenden, diese nur-lese-Werte?

Ich will nicht entfernen Sie Sie aus der ursprünglichen gespeicherten Prozedur, da Sie benötigt werden durch die Nutzer. Die eine Problemumgehung, die ich kommen mit so weit ist, um Sie an die gespeicherte Prozedur und dann einfach benutzen Sie niemals. Ich bin mir zwar ziemlich sicher, dass dies funktionieren würde, es ist sehr viel gerade über das problem, anstatt es zu beheben.


EDIT: Zusätzlichen code, pro Anfrage

Dies ist die Methode, die Ausgänge die Parameter der trace Funktion:

protected void TestSqlDataSource_Updating(object sender, SqlDataSourceCommandEventArgs e)
{
    for (int i = 0; i < e.Command.Parameters.Count; i++)
    {
        Trace.Write(e.Command.Parameters[i].ParameterName);
        if (e.Command.Parameters[i].Value != null)
        {
            Trace.Write(e.Command.Parameters[i].Value.ToString());
        }
    }
}

Dies ist die gespeicherte Prozedur für Aktualisierungen:

ALTER PROCEDURE [dbo].[usp_UpdateTest]
    @testId INT ,
    @testerLicense INT ,
    @premiseOwner VARCHAR(50) ,
    @premiseAddress VARCHAR(150) ,
    @premiseCity VARCHAR(50) ,
    @premiseState VARCHAR(2) ,
    @premiseZip VARCHAR(10) ,
    @protectionType VARCHAR(11) ,
    @testType VARCHAR(2) ,
    @repairs VARCHAR(200) ,
    @notes VARCHAR(300) ,
    @testDate DATETIME ,
    @employerName VARCHAR(50) ,
    @employerAddress VARCHAR(150) ,
    @phoneNumber VARCHAR(25) ,
    @emailAddress VARCHAR(60) ,
    @dataEntryName VARCHAR(50) ,
    @dataEntryPhone VARCHAR(25) ,
    @signature VARCHAR(50) ,
    @entryDate DATETIME
AS 
    BEGIN
        SET NOCOUNT ON;

        UPDATE  dbo.Tests
        SET     TesterLicense = @testerLicense ,
                PremiseOwner = @premiseOwner ,
                PremiseAddress = @premiseAddress ,
                PremiseCity = @premiseCity ,
                PremiseState = @premiseState ,
                PremiseZip = @premiseZip ,
                ProtectionType = @protectionType ,
                TestType = @testType ,
                Repairs = @repairs ,
                Notes = @notes ,
                TestDate = @testDate ,
                EmployerName = @employerName ,
                EmployerAddress = @employerAddress ,
                PhoneNumber = @phoneNumber ,
                EmailAddress = @emailAddress ,
                DataEntryName = @dataEntryName ,
                DataEntryPhone = @dataEntryPhone ,
                Signature = @signature ,
                EntryDate = @entryDate 
        WHERE TestID = @testId
    END
  • Haben Sie überprüfen, ob es irgendwelche Rechtschreibfehler oder Datentyp-Konvertierungsfehler?
  • Ja. Ich kopierte die beiden Sätze von Parametern in Excel und gingen Zeile für Zeile vergleichen. Das war das häufigste problem in dieser allzu häufigen Frage hier, also ich war sehr vorsichtig, um sicherzustellen, dass Sie genaue. Genutzt haben trace um alle Parameter anzuzeigen, es ist vorbei, ich kann sicher sagen, dass es tatsächlich vorbei zu viele Argumente, aber ich weiß nicht, wie um Sie auszuschalten.
  • Würdest du bitte fügen Sie Ihre "usp_UpdateTest" und "TestSqlDataSource_Updating" hier, wenn es Ihnen nichts ausmacht.
  • Hinzugefügt die angeforderten code.
  • Ich kann empfehlen Ihnen, eine Sache, die für jeden parameter update auf die _updating Fall geben Sie es eins nach dem anderen, wie e.Befehl.Parameters["@testerLicense"].Wert = Wert-also wenn es ein Problem gibt, dass es mehr Parameter es würde eingeschränkt werden, indem die nicht. der Parameter hier angegeben.
  • Ich sehe, dass u haben erwähnt, dass u bereits versucht, diesen Ansatz. Ich bin auf der Suche nach mehr Optionen für Ihre problem-Korrektur. Update u wenn I finden Sie einige gute Sache auf die gleiche. Danke.

InformationsquelleAutor techturtle | 2013-02-05
Schreibe einen Kommentar