NPGSQL Paramter für "ODER BY" funktioniert nicht!

Hallo,

ich nutze NPGSQL mit C#. Habe nun folgendes Problem:
Wenn ich beim NpgsqlCommand den Paramter " :astonished: rder" hinzufuege, habe ich gedacht, dass dies genau so funktioniert, wie bei meinen Datenfeldern. Aber es passiert nichts. Nicht mal eine Exception wird ausgelöst!??? Warum? Oder werden Parameter in der “order by” Klausel nicht unterstützt?

 
NpgsqlCommand comm = new NpgsqlCommand(
"select * from tblWort where (typ=:typ) and (utyp=:utyp) order by :o rder")
 
comm.Parameters.Add(new NpgsqlParameter("order", DbType.String));
comm.Parameters["order"].Value = "typ desc";

Gruß

Bubblegum

:typ und :utyp sind Variable, die Du gegen eine Spalte vergleichst, :astonished: rder aber eine Spalte. Das ist ein komplett anderes Ding, ein komplett anderes SQL.


Andreas

folgendes Passiert da nämlich:

natuerlich wird dieser Parameter einfach so genommen … und auch fuer dieses ORDER BY verwendet … was dann so ausschaut:

select ..... from .... order by 'mein-stringwert-welchen-ich-zugewiesen-habe'

also ist für jede Zeile deiner Ergebnismenge der gleiche wert nach ORDER BY - also wird die Sortierung unverändert bleiben - da der gleiche Wert in jeder Reihe nie größer als der vorige oder nachfolgende ist (nochmal: weil es eben kein Feldname ist, sondern ein Wert. Du Könntest da auch beliebige Ausdrücke platzieren).

Möglicherweise kann man NPGSQL aber austricksen, du solltest dir mal anschauen ob es ne Möglichkeit gib, einen solchen NPbla - parameter so zu manipulieren, dass der Wert den du uebergibst nicht quotiert in das Statement eingefügt wird. Pech hast du auf alle faelle, wenn obiges sowieso ein Prepared Statement ist, dann erledigt das Zuordnen PG selbst … und dieses wird von nichts anderem ausgehen als einen Wert.

Grundsätzlich ist doch die SELECT-Ausführungsprozedur folgende:

prepare
execute
fetchnext

prepare kompiliert den SQL-Befehl, wozu das Festlegen des
execution-plans gehört, wobei eine Datenbank nachschaut was
es denn an bestgeeignetsten indizes gibt.
die sortierreihenfolge ist dabei eines bzw. das wichtigste
kriterium.

execute übergibt bindvars in der where-klausel an die
datenbank.

wenn nun bindvars in der “order by”-kausel ausgewertet würden,
also in tabellenspalten oder ausdrücke (z.B. 2*col1 -25)
übersetzt-gedeutet würden, könnte während des prepare-
schrittes kein passender index ausgewählt werden, weil
hier dann noch nicht bekannt wäre wonach sortiert werden soll.
daraus folgere ich, “order by :var” kann nicht funktionieren.


lösung:
vor dem prepare müssen im programm fallunterscheidungen
stehen und unterschiedliche, feste “order by”-Klauseln
entsprechend wunsch dem select-string angehängt werden.
(die umschaltung der sortierreihenfolge zur laufzeit geht nur
durch erneutes preparen.)


geert

Das hat z.B. Ausworkungen, wenn ein partieller Index verwendet wird:
In dem Fall weiss die DB nicht, ob der Wert im Index vorkommt oder nicht und kann daher den Index beim Prepare nicht verwenden. Das nicht dann nicht nur auf das Sortieren sondern auch auf die Vergleiche zu.

er kriegt keinen Fehler - weil kein Fehler da ist … also kein syntaktischer oder soetwas … denn die Variable hinter dem ORDER BY ist keine Variable für einen Feld-Bezeichner, sondern für einen Wert - der dann als ODER BY Ausdruck verwendet wird. Und ORDER BY ist substanzlos - diese Sortierung eruebrigt sich - er sollte einfach eine unsortierte Ergebnismenge bekommen.