SqlParameter ist bereits in einer anderen SqlParameterCollection enthalten, aber ich sehe nicht wie

8

Ich habe den folgenden Code.

%Vor%

Wenn ich versuche, resultsQuery aufzuzählen, erhalte ich folgende Fehlermeldung.

  

Der SqlParameter ist bereits in einer anderen SqlParameterCollection enthalten.

Diese Fehlermeldung scheint klar genug zu sein, aber ich kann nicht sehen, wo ich ein SqlParameter zu mehr als einem irgendetwas hinzufüge. Das einzige, was ich mir vorstellen kann ist, dass der erste Parameter für beide Aufrufe identisch ist. Könnte C # sie irgendwie kombinieren? So oder so, ich brauche sie die gleichen Daten enthalten.

Kann jemand sehen, was hier passiert?

BEARBEITEN:

Entschuldigung, dies stellte sich als Debugging-Problem heraus. Ich hatte ein anderes Problem, das die erwarteten Ergebnisse verhinderte. Aber wenn ich den Debugger einbringe und meinen Code durchtrete, erhalte ich den oben erwähnten Fehler.

Es sieht so aus, als ob der Code mit dem fraglichen SqlParameter ausgeführt wird, und dann versuche ich den Inhalt der Abfrage zu inspizieren und die Abfrage wird erneut mit demselben SqlParameter ausgeführt, und das ist Was verursacht den Fehler.

Leider, jetzt, wo ich ein Kopfgeld habe, kann ich die Frage nicht löschen.

    
Jonathan Wood 19.06.2016, 21:27
quelle

3 Antworten

6

Ich hatte kein gutes Verständnis dafür, was passiert ist, als ich diese Frage gestellt habe. Nach weiterem Studium stellt sich heraus, dass:

  1. Ein separates Problem führte dazu, dass mein Programm die (erwarteten) Ergebnisse nicht zeigte.

  2. Mit dem Visual Studio-Debugger hatte ich in diesem Code einen Haltepunkt gesetzt. Als ich durchging, wurden die Abfragen ausgeführt. Als ich dann versuchte, die Daten zu untersuchen, führte dies dazu, dass die Abfragen erneut ausgeführt wurden. Es war diese doppelte Ausführung, die den Fehler verursachte, den ich meldete. In der Tat trat dieser Fehler nicht auf, wenn der Code normal ausgeführt wurde.

Danke an alle, die sich die Zeit genommen haben, sich dieses Thema anzusehen.

    
Jonathan Wood 23.06.2016, 22:03
quelle
3

Löschen Sie die Parameter, bevor Sie sie definieren: -

%Vor%     
Kamamba 19.06.2016 21:50
quelle
1

Versuchen Sie es. Statt:

%Vor%

Verwenden:

%Vor%

Defferred Query Ausführung ist ein weiterer Grund, warum ich kein Fan von EF bin. Wenn Sie den ToList () -Aufruf verschieben, zwingen Sie EF stattdessen, Sofortige Ausführung auszuführen. In dem Update zu Ihrer Frage geben Sie an, dass Ihr Problem mit einem Debugging-Problem der IDE zusammenhing, die Ihre Abfrage zweimal wiederholt (die doppelte Parameterausnahme verursacht).

Sie können Ihr Debugging-Problem jedoch vermeiden, indem Sie die Ausführung von Defferred Query umgehen und die Ausführung sofort erzwingen, wodurch der Inhalt der Variablen resultsQuery von einer Abfrage, die auf den tatsächlichen Ergebnissatz wartet, geändert wird.

Um es klar zu sagen, das Verschieben des Aufrufs von ToList () erzwingt die sofortige Ausführung der Abfrage in Ihre Variable "resultsQuery", die ihren Inhalt ändert (und deshalb änderte ich den Variablennamen, um seinen geänderten Inhalt widerzuspiegeln). Die Variable enthält jetzt die zurückgegebenen Ergebnisse Ihrer Abfrage und nicht die Abfrage selbst. Wenn Sie bei der Ausführung der Ausführung aufzählen, werden Sie daher über eine statische Liste zurückgegebener Ergebnisse auflisten, anstatt die Abfrage erneut auszuführen . Dies würde daher verhindern, dass die Ausnahme ausgelöst wird.

Das ist auch der Grund, warum ich in meinem Kommentar darauf hingewiesen habe, dass das Thema mir nie passiert ist (abgesehen davon, dass ich mich, wenn möglich, heutzutage von EF fern halte).

Sie können mehr über MSDN hier lesen:

Ссылка

Von dem obigen Link gibt Microsoft an:

Um die sofortige Ausführung einer Abfrage zu erzwingen, die keinen Singleton-Wert erzeugt, können Sie die Methode ToList , die Methode ToDictionary oder aufrufen > ToArray -Methode für eine Abfrage- oder Abfragevariable.

    
HBomb 22.06.2016 00:07
quelle

Tags und Links