Announcement

Collapse
No announcement yet.

ADO und Parameter

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

  • ADO und Parameter

    Hallo,

    ich bin dabei ein kleines Programm von BDE auf ADO umzustellen und verzweifel daran. Schon mal vorab bin ziemlicher Delphi neuling und ADO kenne ich noch fast gar nicht. Aber jetzt zu meinen Problem.

    Habe ein einfaches Query welches Daten in einem GRID anzeigen soll. Unter BDE lief das ganze so.

    <PRE>
    query1.sql.add('select * from tabelle where wert1 = :string1 and wert2 = :string2 and wert3 = :integer1');

    query1.params[0].asstring := edit1.text;
    query1.params[1].asstring := edit2.text;
    query1.params[2].asinteger := strtoint(edit3.text);

    query1.open;
    </PRE>

    soweit ja kein Problem bei BDE

    Bei ADO ist das ja ähnlich.

    <PRE>
    adoquery1.sql.add('select * from tabelle where wert1 = :string1 and wert2 = :string2 and wert3 = :integer1');

    adoquery1.parameters[0].value := edit1.text;
    adoquery1.parameters[1].value := edit2.text;
    adoquery1.parameters[2].value := strtoint(edit2.text);

    adoquery1.open;
    </PRE>

    Solange ich nur mit String Parametern Arbeite geht alles Wunderbar aber sobald ich einen Integer Parameter übergebe kommt die Meldung <B> Typname ist ungültig </B>. Hatte auch schon folgendes probiert (mehr als nicht gehen kann es ja nicht)

    <PRE>
    adoquery1.parameters[0].value.asstring := edit1.text;
    adoquery1.parameters[1].value.asstring := edit2.text;
    adoquery1.parameters[2].value.asinteger := strtoint(edit3.text);
    </PRE>

    Das letztere gibt dann die Meldung <B> Variante referenziert kein Automatisierungsobjekt</B>

    Wie gesagt ich bin ziemlicher Delphi Anfänger und nach einem Tag probieren, googlen usw. komme ich einfach nicht weiter.

    Gruß und schonmal danke
    Markus

  • #2
    Hallo,

    &gt;...soweit ja kein Problem bei BDE. Bei ADO ist das ja ähnlich.

    nein - das ist ein Trugschluss! Hinter TADOQuery steckt nur eine VCL-Wrapperkomponente, die die ganze Arbeit sofort an die originalen Microsoft COM-Objekte von ADO weiterdelegiert (COM-Objekt = Automatisierungs-Objekt). Dies bedeutet aber auch, dass die originalen ADO-Objekte die Regeln bestimmen. Das folgende Beispiel für das Hantieren mit den nativen ADO-Objekten verdeutlicht dies:
    <pre>
    <b>var</b>
    aCon : _Connection;
    aCommand : _Command;
    vRows : OleVariant;
    iCnt : Integer;
    <b>begin</b>
    aCon := CoConnection.Create;
    aCon.CursorLocation := adUseClient;
    aCon.Open(cCS, <font color="#9933CC">''</font>, <font color="#9933CC">''</font>, adConnectUnspecified);
    <b>try</b>
    aCommand := CoCommand.Create;
    <b>try</b>
    <b>with</b> aCommand <b>do</b> <b>begin</b>
    CommandType := adCmdText;
    CommandText := <font color="#9933CC">'INSERT INTO CommandTbl (Nr,Wert) '</font> +
    <font color="#9933CC">'VALUES (?,?)'</font>;
    Parameters.Append(CreateParameter(<font color="#9933CC">'Nr'</font>, adInteger,
    adParamInput, 4, EmptyParam));
    Parameters.Append(CreateParameter(<font color="#9933CC">'Wert'</font>, adVarChar,
    adParamInput, 10, EmptyParam));
    Set_ActiveConnection(aCon);
    <b>for</b> iCnt := 1 <b>to</b> 100 <b>do</b> <b>begin</b>
    Parameters[0].Value := iCnt;
    Parameters[1].Value := <font color="#9933CC">'Nr. '</font> + IntToStr(iCnt);
    Execute(vRows, EmptyParam, adExecuteNoRecords);
    <b>end</b>;
    <b>end</b>;
    <b>finally</b>
    aCommand := <b>nil</b>;
    <b>end</b>;
    <b>finally</b>
    aCon.Close;
    aCon := <b>nil</b>;
    <b>end</b>;
    <b>end</b>;
    </pre>
    Bevor die Parameter-Werte übergeben werden dürfen, muss die Parameter-Kollektion gefüllt werden, damit das ADO-Objekt die Datentypen kennt.

    Es gibt somit nur 3 Optionen: <br>
    1. SQL fest im Objektinspektor zuweisen, dann füllt Delphi die Parameters-Kollektion (siehe *.dfm)<br>
    2. SQL dynamisch zur Laufzeit zuweisen, dass muss das Programm aber selbst die Parameters-Kollektion füllen <br>
    3. Wenn Performance keine Rolle spielt, die Parameter-Kollektion automatisch über den Aufruf der Methode <B>Refresh</b> füllen lassen.

    In <i>http://www.software-support.biz/sus/sus_buch/psecom,id,21,nodeid,11,_language,de.html</i> ist sowohl das Hantieren mit den VCL-Komponenten (ADO Express alias dbGo) als auch das Hantieren mit den nativen ADO-Objekten zu finden

    Comment


    • #3
      danke, jetzt klappt es, habe es über den Objektinspektor gelöst.

      Gruß
      Marku

      Comment

      Working...
      X