Ich habe eine ziemlich agnostische ADO.NET-Anwendung, die eine Verbindung zu einer Reihe von Datenbanken herstellt und in der Lage ist, die notwendigen Informationen zur Ausführung zu extrahieren. Ich habe einen Haken mit DB2 und wie es benannte Parameter behandelt, insbesondere wenn ich einen benannten Parameter in derselben Abfrage wiederverwende. Ich kenne einige Möglichkeiten, um dies zu umgehen, indem ich einfach weitere Parameter hinzufüge, aber theoretisch sollte es so funktionieren wie bei anderen Datenbanken, mit denen ich mich verbinde, da der Parametername derselbe ist.
Was ich mache, ist etwas komplizierter und umfasst Unterabfragen usw., aber um dies zu demonstrieren, nehmen Sie die folgende Abfrage:
Wählen Sie einen Wert aus test.table, wobei cola = @ key1 und colb = @ key1;
Der benannte Parameter @ key1 wird zweimal verwendet.
Mein Code ist wie folgt:
%Vor%Wenn ich das ausführe, bekomme ich eine Ausnahme, die mir sagt:
%Vor%Ich bekomme, was es mir sagt, aber ich suche nach Hilfe, wie ich herausfinden kann, wie der Provider den benannten Parameter für beide Parameter verwenden kann, da sie gleich sind. Es scheint, dass es eine blinde Zählung benannter Parameter macht und nicht merkt, dass sie die gleichen benannten Parameter sind. SQL Server scheint mir das mit dem gleichen Code oben zu ermöglichen. Ich vermute, dass dies nur einer dieser Unterschiede in den Anbietern ist, aber ich hoffe, dass jemand darauf gestoßen ist und eine Lösung für DB2 hat, die nicht in den spezifischen DB2-Code eingeht.
Danke, schätze die Hilfe.
Nun, ich habe ein wenig mehr gegraben, und ich frage mich, ob es der Connector sein könnte, den Sie verwenden. Also mache ich folgendes (was sehr ähnlich zu dem ist, was Sie tun)
in meiner App-Konfigurationsdatei habe ich
%Vor%in meiner Databasemanager-Klasse würde ich es so initialisieren
%Vor% Ich füge Parameter etwas anders hinzu. Ich habe eine Dictionary<string,object>
, die ich auch bei der Einrichtung meiner Abfrage hinzufüge. Um Ihr Beispiel zu verwenden, hätte ich dies
dann lesen ist, wo das OP und ich ähnlichen Code
haben %Vor%Das Ausführen des besagten Codes funktioniert für mich, also frage ich mich, ob der Unterschied in dem Provider liegt, den wir verwenden. Ich benutze benannte Parameter in der Produktion und bin seit mindestens einem Jahr, möglicherweise näher an 2 Jahren.
Ich werde sagen, dass ich den gleichen Fehler bekommen habe, wenn ich im Wesentlichen den gleichen Code zweimal ausgeführt habe, wie in diesem Code gezeigt
%Vor% in Zeile 3 var list = array.ToList()
war die Lösung für das Problem, das Sie für mich sahen. Vorher hatte ich if (!array.Any())
, was die Abfrage ausführen und die Parameter verwenden würde (die ich lösche, bevor ich die Abfrage erlebe). Wenn ich nun jedes Element im Array aufzählen und ausdrucken wollte, bekam ich den Fehler. Für mich bestand das Problem darin, dass die Abfrage erneut ausgeführt wurde, dass ich keine Parameter mehr hatte. Die Lösung bestand darin, die Abfrage mit der ToList () aufzulisten und dann die Liste zu überprüfen und zu drucken.
Tags und Links c# ado.net ibm-midrange db2-400