Verwendung von Parametern



  • Hallo,

    eine Frage an Euch Datenbankexperten:
    Ich möchte in einer SQL-Abfrage den Tabellennamen als Parameter angeben.
    Der SQL-String lautet:

    einsatz->Parameters->CreateParameter("xtable",ftString,pdUnknown,-1,NULL);
    einsatz->Prepared = true;
    einsatz->SQL->Clear();
    einsatz->SQL->Add("select sign,drehen from :xtable");
    ...
    ...
    ...
    einsatz->Parameters->ParamByName("xtable")->Value = "bwueins";
    ...
    ...
    ...
    einsatz->DisableControls();
    //  ShowMessage(":table = "+einsatz->Parameters->ParamByName("table")->Value); <-- hier ist der Wert von :xtable = "bwueins"
    einsatz->Prepared = true;
    einsatz->Open();
    

    Das Öffnen der Query bringt folgenden Fehler:

    EOleException (1)

    [CA][Ingres 3.0 ODBC Driver][Ingres 3.0]line1, Syntax error on '?'. The correct syntax is:
    SELECT [ALL|DISTINCT] target_list
    FROM table(s)
    [WHERE search_cond]
    [GROUP BY col(s)]
    [HAVING search_cond]
    [UNION subselect]
    [ORDER BY col(s)]

    Der Fehler bedeutet meiner Meinung nach, das der Tabellenname in der Select-Anweisung nicht angegeben ist.
    Ist in meinem Code die Reihenfolge der Aufrufe falsch oder kann man den Tabellennamen nicht als Parameter angeben.

    Gruß Udo



  • Du solltest statt der Eigenschaft 'Prepared' besser die Methode 'Prepare' aufrufen:

    einsatz->Prepare();
    

    Falls 'Prepared' vorher true war, werden die Parameter nicht (nochmals) übernommen.

    Falls das auch nichts bringt, dann mußt du den SQL-Befehl von Hand zusammen setzen:

    AnsiString sTableName = "...";
    
    einsatz->SQL->Add("select sign,drehen from " + sTableName);
    


  • Hallo,

    1. Die Methode ->Prepare() gibt es nicht für TADOQuery (im BCB 6)
    2. Das zusammensetzen des SQL-Strings mit Variablen hatte ich vorher.
    Ich wollte aber Parameter einsetzen, da mir das als die elegantere Methode erscheint.
    3. Wenn man Prepared auf false läßt, dann kommt der gleiche Fehler nur mit ...SyntaxError on (~V)...

    Gruß Udo



  • Folgender Code müsste funktionieren:

    ...
    einsatz->SQL->Add("select sign,drehen from :xtable");
    einsatz->Prepared = true;
    // Diese Methode legt die entsprechenden Parameter Objekte automatisch an
    einsatz->Parameters->ParseSQL(einsatz->SQL->Text, true);
    // Zuweisung eines Parameterwerts
    einsatz->Parameters->ParamValues["xtable"] = "bwueins";
    einsatz->Open();
    ...
    


  • Hallo,

    @mortino

    Ich habe den Code gerade getestet, er produziert den gleichen Fehler wie im ersten Post beschrieben.

    Gruß Udo



  • Der SQL selbst ist korrekt?
    Nicht, dass 'sign' am Ende ein reserviertes Schlüsselwort von Ingres ist.



  • Hallo,

    Nein, ist es nicht.
    Wenn ich den Tabellennamen in eine Variable packe und den SQL-String damit zusammenbaue, funktioniert alles korrekt.

    Gruß Udo



  • die Verwendung von Parametern geht meines Wissens nach nicht für Tabellennamen oder Spaltennamen sondern nur wenn man nach Werten sucht oder ähnliches, z.B.:

    select spalte1 from tabelle where spalte1 = :spalte1
    insert into tabelle (spalte1) values (:spalte1)
    usw...



  • Linnea schrieb:

    die Verwendung von Parametern geht meines Wissens nach nicht für Tabellennamen oder Spaltennamen

    Genau das ist das Problem. Paramater sind nur für Werte einsetzbar.



  • Hallo,

    Danke für Eure Hilfe.

    Dann muß man den SQL-String in solchen Fällen eben doch aus Variablen zusammensetzten.

    Gruß Udo


Anmelden zum Antworten