Page 2 of 2 FirstFirst 1 2
Results 16 to 23 of 23

Thread: Query's in een loop, fout

  1. #16
    Er zijn nog weinig mensen, die er daadwerkelijk mee werken
    Dat kon nog wel eens tegenvallen. Ik denk dat de bulk van de db apps (na de bde tijden) ze gebruiken.

    en dan hebben ze nog hun eigen manier van invullen omtrend een insert met een key. Eigenlijk is auto increment met Clientdataset uit ten boze.
    Dat probleem heeft niets met cds te maken. Ook niet met delphi trouwens. Een autoinc veld moet uit de databse gelezen worden na de insert, dat is dus in iedere omgeving zo.

    Autoinc velden in de database zouden dus gewoon verboden moeten worden

  2. #17
    Member
    Join Date
    Mar 2003
    Location
    Netherlands
    Posts
    638
    @jkuiper. Hier een klein voorbeeldje van een TSQLQuery die een INSERT op een database (msssql in mijn geval omdat ik hier geen MySQL draai) uitvoert. Mijn tabel table1 bevat een ID veld (int PX Auto_Inc) en een Value veld (varchar(50)).

    De code die de TSQLQuery aanroept is;
    Code:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    
      with TSQLQuery.Create(nil) do
      try
        SQLConnection := SQLConnection1;
        SQL.Text := 'INSERT INTO TABLE1 (VALUE) VALUES (:Val1)';
        Params.ParamByName('Val1').AsString := Edit1.Text;
        ExecSQL(False);
      finally
        Free;
      end;
    end;
    En nog even de code om door een recordset heen te lopen;

    Code:
      with TSQLQuery.Create(nil) do
      try
        SQLConnection := SQLConnection1;
        SQL.Text := 'SELECT VALUE FROM TABLE1';
        Open;
        while not Eof do
        begin
          ShowMessage(FieldByname('Value').AsString);
          Next;
        end;
      finally
        Free;
      end;
    Alex "leXTer" van der Vliet
    Delphi Programmer

    And may the source be with you.

  3. #18
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Je hebt mij enigszins overtuigt Alex, zolang het maar 1 eenrichtingsverkeer is (natuurlijk even getest). Alleen ging dat niet op voor RogierVLD, omdat hij ook wilde controleren of het emailadres bestaat in het doeltabel.
    Delphi is great. Lazarus is more powerfull

  4. #19
    Member
    Join Date
    Mar 2003
    Location
    Netherlands
    Posts
    638
    Kan toch... Kijk naar de SELECT die erbij staat. Je hebt binnen je TSQLQuery een recordCount en de mogelijkheid om door records heen te lopen. Binnen de select kan je parameters gebruiken om je query te vullen en dmv de recordCount of door de set heen te lopen bepalen of deze al bestaat.
    Last edited by alexvdvliet; 31-Aug-09 at 11:28.
    Alex "leXTer" van der Vliet
    Delphi Programmer

    And may the source be with you.

  5. #20
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Natuurlijk kan dat, maar dan kan je geen gebruik meer maken van van de TSQLQuery, die een SELECT doet. Delphi komt dan met de melding: Can not perform this operation on a closed dataset.
    Je zal het dan anders moeten oplossen
    delphi Code:
    1. procedure TForm6.Button2Click(Sender: TObject);
    2. var t : integer;
    3.     s : string;
    4.     SQLQuery1, SQLQuery2 : TSQLQuery;
    5. begin
    6.   SQLQuery1 := TSQLQuery.Create(nil);
    7.   SQLQuery2 := TSQLQuery.Create(nil);
    8.   try
    9.     SQLQuery1.SQLConnection := SQLConnection1;
    10.     SQLQuery2.SQLConnection := SQLConnection1;
    11.     SQLQuery1.SQL.Text := 'SELECT fieldname FROM table';
    12.     SQLQuery2.SQL.Text := 'INSERT INTO table VALUES (fieldvalue)';
    13.     SQLQuery1.Open;
    14.     for t := 1 to 100 do
    15.     begin
    16.       if SQLQuery1.locate('fieldname',varArrayOf([t]),[]) then
    17.         s := 'Gevonden'
    18.       else
    19.       begin
    20.         SQLQuery2.ParambyName('fieldname').AsInteger := t;
    21.         SQLQuery2.ExecSQL(false);
    22.         s := 'inserted'
    23.       end;
    24.       memo1.Lines.Add(format('ID: %3d %s',[t,s]));
    25.       SQLQuery1.Next;
    26.     end;
    27.   finally
    28.     SQLQuery1.Free;
    29.     SQLQuery2.Free;
    30.   end;
    31. end;
    Maar dan ga je snel meerder connecties openen voor 1 tabel en volgens mij is dat niet handig. Helemaal niet als je met datasnap werkt.

    Dit werkt wel, maar waar zit de functionaliteit van de CDS dan in, die Carry Jensen zo zorgvuldig uitlegt?
    Delphi is great. Lazarus is more powerfull

  6. #21
    Member
    Join Date
    Mar 2003
    Location
    Netherlands
    Posts
    638
    In jouw voorbeeld 1 voor de resultset die na het openen weer vrijgegeven wordt aangezien we praten over resultsets) en een voor iedere insert. Je kan al je inserts in een StringList plaatsen en dan die als een bulk doorsturen.

    De CDS gebruik je in princiepe alleen wanneer je ook informatie visueel in bijvoorbeeld een grid wilt tonen aangezien we niet meer over recordsets maar resultsets praten.

    De CDS dient dus in dat geval puur als een storage voor je resultsets. Je kan een TSQLTable/TSQLQuery nl niet aan een grid hangen. Wanneer de CDS een ApplyUpdates doet wordt er door de provider een Update/Insert statement gegenereerd op basis van alle velden binnen de CDS. De Where is op basis van de ProviderFlags (Kijk in de field Editor van de CDS). (pfInUpdate, pfInWhere, pfInkey etc). Deze update wordt dan naar de Database uptgevoerd.
    Alex "leXTer" van der Vliet
    Delphi Programmer

    And may the source be with you.

  7. #22
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Ik denk dat dit een oneindige discussie wordt hoe het wel of niet moet. We hebben ieder onze eigen implementatie van hoe het wel en niet moet. Het idee om een stringlist te gebruiken, bruist tegen mijn principes in. Dan kan ik net zo goed gebruik maken van een losse TDataset om mijn INSERTS tijdelijk op te slaan, om daarna mijn TSQLQuery te sluiten om vervolgens weer mijn TSQLQuery te open en de INSERTS te verwerken.

    Maar het belangrijkste is: Rogier is geholpen en dat is toch het enige wat telt
    Delphi is great. Lazarus is more powerfull

  8. #23
    Member
    Join Date
    Mar 2003
    Location
    Netherlands
    Posts
    638
    Daar ga ik je helemaal gelijk in geven. Dit is inderdaad een oneindige discussie (overgens wel leuk want we leren er allebij van ) en Rogier is er inderdaad ook mee geholpen.
    Alex "leXTer" van der Vliet
    Delphi Programmer

    And may the source be with you.

Page 2 of 2 FirstFirst 1 2

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •