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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Endete herauszufinden dieses heraus auf meine eigene. Es bezog sich auf die Tatsache, dass Visual Studio erstellt die Vorlagen für mich, basierend auf der gespeicherten Prozedur-schema. Wenn die Vorlagen automatisch generierte, jedes Textfeld, in der
<EditItemTemplate>
Abschnitt generiert wird, wie diese:Stellt sich heraus, dass es ist die
Bind
- Anweisung, die dies verursacht. VS erstellt automatisch ein parameter für jedes Feld gefüllt mitBind
. Obwohl ich geführt wurde, zu glauben, dass die<UpdateParameters>
sollte der Abschnitt überschrieben haben, aber es war eigentlich anders herum. Ich war in der Lage zu verhindern, dass diese wenigen nur-lese-Felder von vorbeifahrenden zurück, Ihre Parameter ändern Sie den code auf die Felder ausBind
zuEval
:Funktioniert nun perfekt.
Nachtrag:
Gefunden, dass dies bewirkt, dass das gleiche problem in die andere Richtung als gut. Wenn Sie markieren Sie ein Feld, in das Sie nicht wollen, bearbeitet
Eval
aber es muss in dem update enthalten (wie beispielsweise eine Zeilen-ID) es wird nicht funktionieren, diese Zeit für zu wenige Parameter. Ich Frage mich nun, was der Zweck des<UpdateParameters>
Abschnitt auch ist, da es scheint nicht zu Folgen, alles, was dort...Bind
Aussagen mitEval
nur die wenigen, die sind nicht zugelassen, um die Daten zu aktualisieren.Eval
ist ein nur-lese-Befehl, so dass es nicht zu einer Aktualisierung dieser Felder.Können Sie löschen Sie unerwünschte Parameter, die während der e.g OnDeleting Ereignis (e.Befehl.Parameter.RemoveAt(i)).