Announcement

Collapse
No announcement yet.

Parameter bei SELECT Anweisung variabel ändern (ADODataset)

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

  • Parameter bei SELECT Anweisung variabel ändern (ADODataset)

    Hallo Entwickler-Gemeinde ...

    ich habe folgendes Problem:
    Ich möchte gern per SELECT Anweisung eine Datenmenge vom MS-SQL Server holen.<BR>
    Im Buch "Delphi und ADO" fiel mir auf, dass Herr Kosch des öfteren mit Parametern arbeitet.
    <BR>
    Also probiere ich folgendes :
    <BR>
    Ich lege für mein ADODataset von Hand zwei Parameter im
    Objektinspektor an: Suchtext1 und Suchtext2.<br>
    Nachdem der Benutzer den Suchdialog ausgelöst hat,
    weise ich die Werte ensprechend zu :<br>

    Paramters[0].Value := Edit1.Text;<br>
    Parameter[1].Value := Edit1.Text;<br>
    <br>
    Dann bereite ich die ADODataset Komponente vor :

    ADODataset.Active := False;<br>
    ADODataset.Commandtext := ' SELECT * FROM Kunden WHERE Nachname LIKE :Suchtext1 AND VORNAME LIKE :Suchtext2' ;<br>
    ADODataset.Active := True;<br>

    Beim ersten Durchlauf funktioniert das hervorragend ...<br>
    Wenn der Benutzer dann zum zweiten Mal den Suchbutton auslöst,<br>
    hat meine SQL-Anweisung offenbar immer noch die letzten Werte,<br>
    obwohl ich ja zuvor wieder zuweise mit :<br>
    Paramters[0].Value := Edit1.Text;<br>
    Parameter[1].Value := Edit1.Text;<br>

    Was mache ich hier falsch ?


  • #2
    <p>Hallo,<br>
    das sieht soweit alles ganz gut aus. Vermutlich steckt der Teufel im Detail:
    sprich dem <b><i>Like </i></b>Operator, zu dem ja auch links oder rechts ein
    %-Zeichen gehört.<br>
    Dieses Prozentzeichen muss dem Parameter mit als Wert zugewiesen werden.<br>
    In meinem Beispiel klappt die von Dir gewünschte Vorgehensweise (Delphi 6.02).<br>
    <pre>procedure TForm1.Button1Click(Sender: TObject);
    begin
    ADODataset1.Active := False;
    ADODataset1.Parameters[0].Value := Edit1.Text+'%';
    ADODataset1.Parameters[1].Value := '%'+Edit2.Text;
    ADODataset1.Commandtext := 'SELECT * FROM Customers WHERE Name LIKE :Suchtext1 and Name LIKE :Suchtext2';
    ADODataset1.Active := True;
    end;
    </pre>
    <p>Vielleicht liegt es aber auch daran, dass Du zweimal Edit1.Text zuweist
    (vielleicht ein Schreibfehler)
    </p>
    <pre><font color="#800000">Paramters[0].Value := Edit1.Text;
    Parameter[1].Value := <b>Edit1</b>.Text;</font>
    </pre>
    Wenn das alles nichts hilft, schau doch einfach mal im Profiler nach, was für
    ein Commandtext an den Server geschickt wird.<br>
    Viele Grüsse, Hermann
    <p>&nbsp;</p>

    <p>&nbsp;</p&gt

    Comment


    • #3
      Hallo Hermann ...<br><br>
      Die "%"-Teile im Suchstring habe ich nur der Lesbarkeit wegen weggelassen. Beim ersten Aufruf funktioniert meine Beispiel auch einwandfrei....!<br>
      <br>
      Wenn ich die Schleife jedoch nochmals durchlaufen lassen, mit anderen Sucheingaben vom Benutzer, dann übernimmt mein SQL-Command offenbar nicht die neuen Parameter-Werte.<br>

      Also, wenn einmal die Parameter "Suchtext1" := 'Meie%' und "Suchtext2" := 'Peter%' mit Parameters.Value zugewiesen habe,<br>
      dann behält er diese Daten sozusagen und gibt beim nächsten mal die gleiche Ergebnismenge aus.<br><br>
      Es ist so, als müsste ich die Adodataset explizit veranlassen, die Parameter neu einzulesen ....!<br>
      Vielleicht liegt es daran, dass ich das ADODataset ja mehrmals nutze, und nicht jedesmal durch Create zur Laufzeit erzeuge, aber das ergibt auch keinen Sinn ...

      Comment


      • #4
        Hallo,

        ich kenne genau dieses Problem mit ADO, wenn man kein Close oder Active := FALSE zwischen den Abfragen integriert.
        Bist Du sicher, dass die Datenmenge bei jedem neuen Durchlauf erstmal geschlossen wird?

        Grü ße

        Juli

        Comment


        • #5
          Ist das Dataset noch 'active', wenn die neuen Parameter gesetzt werden?

          Schon mal mit den Eigenschaften Prepared und ParamCheck 'herumgespielt'?

          Grüße Joche

          Comment


          • #6
            Synchronizität lacht...

            Comment


            • #7
              Hallo Jörg,<br>
              falls Du wirklich alles so machst, wie Du es beschreibst, muss (!) es funktionieren. Mein obiges Beispiel funktioniert völlig problemlos, wobei man die Zeile mit dem Commandtext auch noch weglassen könnte, wenn man ihn bereits zur Entwurfszeit einträgt.
              Versuch doch mal (wenn möglich), alles auf ein Minimum an Funktionalität zu reduzieren. Übrigens: Wenn die Parameter zugewiesen werden, muss die Datenmenge geschlossen sein (würde aber ansonsten auch eine Execption auslösen). Wie sieht denn der komplette Code aus ?<br>
              Grüsse<br>
              Herman

              Comment


              • #8
                Hallo,

                @Hermann: Ohne ein Grund dafür zu haben (nein ich bin doch nicht paranoid ) würde ich die Parameter erst setzen, nachdem der CommandText gesetzt ist. Jörgs Beschreibung zufolge werden die Parameter bei offenem Dataset neu gesetzt... Je nach dem, wie er das Ganze in try catch / __finally gesetzt hat, bekommt er nicht mal eine Fehlermeldung angezeigt (zumindest im C++ Builder ist das möglich).

                Außerdem würde ich ParamCheck auf true setzen (nur für den Fall, daß man das mal irgendwann ausbaut und eine freie Anzahl von Paramtern verwendet).

                Wenn das alles nichts bringt, würde ich das Statement mal ohne Parameter formulieren, nur um zu sehen, ob der Fehler dann noch auftritt und der Fehler an ganz anderer Stelle zu suchen ist.

                Grüße Joche

                Comment


                • #9
                  Hallo Ihr vielen Helfer ...!<br>
                  und vielen Dank erstmal ....<br>
                  <br>
                  Ich habe natürlich in Wirklichkeit eine viel aufwendigere Funktion dahinter liegen und habe das in meinem Source Beispiel nur in kurzen Schritten veranschaulicht.<br>

                  Morgen früh werde ich mal alles auf die kleinste Funktionsweise beschränken, und dann schreibe ich euch, was dabei raus kam.<br>
                  <br>
                  BTW: Ich habee Paramcheck auch auf True gesetzt ....und auch schonmal vorher die Adodataset auf False gesetzt ...

                  Gruss an Alle!
                  Jör

                  Comment


                  • #10
                    Ausgetestet ......<br>
                    Wenn ich meinen Quelltext auf obiges Beispiel redzuziere, scheint es zu funktionieren .... !!<br>
                    <br>
                    Also muss ich meinen Code nochmal überprüfen .... um zu sehen, warum die Parameter später nicht mehr zugewiesen werden ..
                    <br>
                    <br>
                    Jörg Branah

                    Comment

                    Working...
                    X