Announcement

Collapse
No announcement yet.

Parameter mehrfach in einer Abfrage verwenden

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Parameter mehrfach in einer Abfrage verwenden

    Hallo,

    ich habe mal eine Frage zu einer SQL Abfrage mit mehreren Parametern.

    In der Where Klausel habe ich folgende Konstruktion

    1.
    WHERE ((x = ParameterA) OR (x = ParameterA))

    ADO erkennt in diesem Fall nicht das es sich um den gleichen Parameter handelt und legt einen weiteren ParameterA an. Die konfiguration im Objektinspektor ist identisch mit dem ersten ParameterA. Im Programm müßte ich eben nun auch dem zweiten ParameterA einen Wert zuweisen.
    Hab ich auch getan aber die Abfrage verhält sich anders wie erwartet. Der ParameterA wird nur an das erste vorkommen in der Abfragebergeben.

    Also lösche ich den Paramter in der Parameterliste und bennene den zweiten ParamterA in ParameterB und übergebe im Programm zweimal den gleichen Wert. Einmal an ParamterA und einmal an ParamterB, sonst funtionierts nicht.

    2.
    WHERE ((x = ParameterA) OR (x = ParameterB))

    Dann funktioniert es zwar auch aber mich würde mal interessieren wieso erkennt ADO das nicht? Wenn ich die Abfrage 1 in Access direkt eingebe und starte frag Access mich nur einmal nach dem Wert des ParametersA und die Abfrage ist sogar noch richtig. Im zweiten Fall funktionierts auch in Access sowieso, klar.
    Liegt diese Verhalten wieder mal an dem Delphi ADO Komponenten Überbau ?

    Viele Grüße
    Walter

  • #2
    Hallo,

    >Liegt diese Verhalten wieder mal an dem Delphi ADO Komponenten Überbau?

    Ja. Immer dann, wenn Parameter übergeben werden, ist das <b>Command</b>-Objekt von ADO im Spiel. Von ADO Express wird dies verdeckt, da ADO Express hinter den Kulissen das Ganze zusammenbaut. Um das Prinzip zu verdeutlichen, dient das folgende Beispiel für den direkten Zugriff auf die nativen ADO-Objekte. Für jeden Parameter erwartet das Command-Objekt eine eigene Parameter-Objektinstanz in der Parameters-Kollektion:
    <pre>
    var
    aCon : _Connection;
    aCommand : _Command;
    vRows : OleVariant;
    iCnt : Integer;
    begin
    aCon := CoConnection.Create;
    aCon.CursorLocation := adUseClient;
    aCon.Open(cCS, '', '', adConnectUnspecified);
    try
    aCommand := CoCommand.Create;
    try
    with aCommand do begin
    CommandType := adCmdText;
    CommandText := 'INSERT INTO CommandTbl (Nr,Wert) VALUES (?,?)';
    Parameters.Append(CreateParameter('Nr', adInteger, adParamInput, 4, EmptyParam));
    Parameters.Append(CreateParameter('Wert', adVarChar, adParamInput, 10, EmptyParam));
    Set_ActiveConnection(aCon);
    for iCnt := 1 to 100 do begin
    Parameters[0].Value := iCnt;
    Parameters[1].Value := 'Nr. ' + IntToStr(iCnt);
    Execute(vRows, EmptyParam, adExecuteNoRecords);
    end;
    end;
    finally
    aCommand := nil;
    end;
    finally
    aCon.Close;
    aCon := nil;
    end;
    end;
    </pre>
    Auf der ersten Blick fällt auf, dass die Parameter nur als Fragezeichen <b>(?,?)</b> definiert werden, daher hat das Command-Objekt keine Ahnung davon, dass ein bestimmter Wert zweil Mal eingesetzt werden soll.

    &gt;Wenn ich die Abfrage 1 in Access direkt eingebe und starte fragt Access mich nur einmal <br>
    &gt;nach dem Wert des ParametersA und die Abfrage ist sogar noch richtig.

    In diesem Fall ist ACCESS nur cleverer als ADO Express und duppliziert die Parameter in eigener Regie :-

    Comment


    • #3
      Hi,
      <br>
      <br>>...wieder mal...
      <br>
      <br>wenn ich das richtig sehe, liegt das in der Natur der Dinge (Ado Objekten). Also ist der Delphi ADO Überbau in diesem Fall unschuldig. Oder?
      <br>
      <br>mfg
      <br>P

      Comment

      Working...
      X