Wertefeld an Parameter übergeben



  • Ich verwende ADO-Komponenten im BCB 6.0 Professional mit MSDE bzw. SQL Server Express.
    In einem Transact-SQL-Kommando benutze ich ein "in ()"-statement. Bisher habe ich das Wertefeld als String direkt ins Kommando geschrieben:

    String Beispiel = "'Beispiel1','Beispiel2'";
    AC1->CommandText = "select * from NamesTable where name in ("+Beispiel+")";
    AD1->Recordset = AC1->Execute();
    

    Das funktioniert zwar, aber leider sind die Werte durch Nutzereingabe definiert und daher nicht sicher. Deshalb möchte ich das Wertefeld als Parameter übergeben. Allerdings erhalte ich die Meldung, die Anwendung würde einen Wert vom falschen Typ für den Vorgang benutzen. Bei Google hab ich nichts zum Thema gefunden. Ich habe versucht den Kommagetrennten String direkt zu übergeben und auch ein Variant-Array mit den einzelnen Werten:

    AC1->CommandText = "select * from NamesTable where name in (:names)";
    AC1->Parameters->ParamByName("names")->Value = "'Beispiel1','Beispiel2'";
    AD1->Recordset = AC1->Execute();
    
    Variant Names[2] = {"Beispiel1","Beispiel2"};
    Variant Fields = Variant(Names,1);
    AC1->CommandText = "select * from NamesTable where name in (:names)";
    AC1->Parameters->ParamByName("names")->Value = Fields;
    AD1->Recordset = AC1->Execute();
    

    Beides generiert besagte Fehlermeldung. Ich vermute nun, Parameter können nur Skalare Werte annehmen. Stimmt das?
    Kennt jemand einen Kniff, wie ich das Wertefeld trotzdem in einen Parameter quetschen kann?
    Mir fällt sonst nur ein, eben so viele Parameter, wie es Werte gibt, zum Kommando hinzuzufügen. Hat jemand andere Vorschläge, wie das Problem elegant lösbar ist?



  • Hallo,

    ein Parameter ist intern ein Variant, d.h. es kann nur bestimmte vorgegebene Datentypen annehmen. Die gute Nachricht jedoch ist, daß ein Variant selbst wieder ein Array von Variants unterstützt. Schau mal nach der VCL-Funktion VarArrayCreate(...).
    Wenn du jedoch String-Arrays erstellen willst, dann mußt du wohl als Datentyp varOleStr (Referenz auf einen dynamischen UNICODE-String) verwenden (steht jedenfalls so in meiner BCB5-Hilfe).



  • Danke für die Antwort, aber die hilft mir nicht wirklich weiter.

    Im letzten Beispiel verwende ich ja schon ein Variant-Array und mit VarArrayCreate() passiert nichts anderes, nur etwas umständlicher:

    int Bounds[2] = {0,1};
    Variant VarArray = VarArrayCreate(Bounds,1,varOleStr);
    VarArray.PutElement("Beispiel1",0);
    VarArray.PutElement("Beispiel2",1);
    AC1->CommandText = "select * from NamesTable where name in (:names)";
    AC1->Parameters->ParamByName("names")->Value = VarArray;
    AD1->Recordset = AC1->Execute();
    

    Und ob das nun ein Unicode- oder AnsiString ist, sollte für diese Anwendung völlig egal sein, zumal Variant am ende sowieso das draus macht, was gebraucht wird. Fehlermeldung bleibt jedenfalls die gleiche.


Anmelden zum Antworten