Ergebnis 1 bis 6 von 6

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

  1. #1
    Bubblegum ist offline Neuer Benutzer
    Registriert seit
    12.05.2008
    Beiträge
    27

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

    Hallo,

    ich nutze NPGSQL mit C#. Habe nun folgendes Problem:
    Wenn ich beim NpgsqlCommand den Paramter "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?

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

    Bubblegum

  2. #2
    akretschmer ist gerade online Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.467

    Standard

    Zitat Zitat von Bubblegum Beitrag anzeigen
    Hallo,

    ich nutze NPGSQL mit C#. Habe nun folgendes Problem:
    Wenn ich beim NpgsqlCommand den Paramter "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?

    Code:
     
    NpgsqlCommand comm = new NpgsqlCommand(
    "select * from tblWort where (typ=:typ) and (utyp=:utyp) order by :order")
     
    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, rder aber eine Spalte. Das ist ein komplett anderes Ding, ein komplett anderes SQL.


    Andreas
    Geändert von akretschmer (21.05.2008 um 16:17 Uhr)
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  3. #3
    symbiont ist offline Erfahrener Benutzer
    Registriert seit
    17.03.2008
    Ort
    NULL
    Beiträge
    1.320

    Standard Wie AK schon sagte ..

    folgendes Passiert da nämlich:

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

    Code:
    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.

  4. #4
    geert ist offline Neuer Benutzer
    Registriert seit
    21.02.2006
    Ort
    Hamburg
    Beiträge
    7

    Standard order by mit:Var geht nicht

    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

  5. #5
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.055

    Standard

    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.
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  6. #6
    symbiont ist offline Erfahrener Benutzer
    Registriert seit
    17.03.2008
    Ort
    NULL
    Beiträge
    1.320

    Standard Das hat aber nix mit seinem Problem zu tun

    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 <ein Wert> ist substanzlos - diese Sortierung eruebrigt sich - er sollte einfach eine unsortierte Ergebnismenge bekommen.

Ähnliche Themen

  1. Problem Fehler "konnte stat für Datei ... nicht ausführen"
    Von helmutnn im Forum Allgemeines
    Antworten: 5
    Letzter Beitrag: 10.06.2011, 11:41
  2. Antworten: 3
    Letzter Beitrag: 17.01.2011, 12:30
  3. Antworten: 0
    Letzter Beitrag: 10.01.2011, 10:26
  4. Problem Function geht nicht "invalid input syntax for integer: (0,t,)"
    Von cfi im Forum Trigger und Funktionen
    Antworten: 2
    Letzter Beitrag: 05.09.2008, 08:10
  5. Problem [NpgSql] LargeObject.Read() -> "The Connection is broken."
    Von cfi im Forum Programmierung
    Antworten: 1
    Letzter Beitrag: 05.08.2008, 16:46

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum