Jak zrobić pasek postępu gdy wykonuje się zapytanie w ADOQuery?

0

Witam jak zrobić pasek postępu gdy wykonuje się zapytanie w ADOQuery1.
Podejrzewam ze trzeba użyć ADOQuery1FetchProgress ale nie wiem jak się za to zabrać.
Bardzo dziękuje za odpowiedz.

4

Długo chyba nie szukałeś, co? :P

https://stackoverflow.com/questions/4237112/how-to-see-progress-of-query-execution-during-handle

with ADOQuery1 do
begin
 SQL.Clear;
 SQL.Add('select * from tbl1 where id = '+Edit1.Text);
 ExecuteOptions:=[eoAsyncFetch];
 Open;
end;

procedure TForm1.ADOQuery1FetchProgress(DataSet: TCustomADODataSet; Progress,
  MaxProgress: Integer; var EventStatus: TEventStatus);
begin
  ProgressBar1.Max      :=MaxProgress;
  ProgressBar1.Position :=Progress;
  Application.ProcessMessages;
end;
2

Tylko, że to jest postęp pobierania danych z bazy do komponentu po wykonaniu zapytania przez bazę a do tego dochodzi jeszcze czas samego wykonania zapytania, którego nie jesteś w stanie zobrazować

0

Co napisał cerrato to u mnie nie działa. Zrobiłem tez tak jak jest tutaj napisane https://www.experts-exchange.com/questions/21375593/Progressbar-while-opening-DB.html

czyli

  1. you must set CursorLocation = clUseClient for your TADOQuery
  2. you must set CursorType = ctStatic
  3. you must include the eoAsyncFetchNonBlocking flag in ExecuteOptions property
  4. write next code in OnFetchProgress event:
procedure TForm1.ADOQuery1FetchProgress(DataSet: TCustomADODataSet; Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
begin
  Progressbar1.Max := MaxProgress;
  Progressbar1.Position := Progress;
end

Mam pytanie ten sposób co pokazaliście działa do każdego zapytania? Jak zrobię takie zapytanie:

SQL.Add(" BACKUP DATABASE [PLATNIK] TO DISK = 'D:\platnik.bak' ");

to powinno zadziałać ?

0

Dzięki za zainteresowanie Patryk27 "nie działa" oznacza to ze jak debuguje to nie wchodzi mi do tej procedury. Nawet nic nie wyświetla w Memo

procedure TForm1.ADOQuery1FetchProgress(DataSet: TCustomADODataSet; Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
begin
Memo.Lines.Add('jestem w procedurze ADOQuery1FetchProgress');
Progressbar1.Max := MaxProgress;
Progressbar1.Position := Progress;
end
0

Bo trzeba dodać procedure w zdarzeniach Adoquery...

0

Od tego zacząłem od dodanie procedury w zdarzeniach i ustawienia właściwości jak wyżej. Mimo to nie idzie, i raczej nie pójdzie tak myślę. Ponieważ te zapytanie nie zwraca żadnego rekordu, żadnych danych, tylko tworzy plik backup. Czyli procedura ADOQuery1FetchProgress nie ma nic do roboty ale nie jestem na 100 % pewien. Ma ktoś pomysł jak zrobić progressbar ?
Może zmodyfikować zapytanie SQL.Add(" BACKUP DATABASE [PLATNIK] TO DISK = 'D:\platnik.bak' WITH NOINIT, STATS = 10" "); jak myślicie ?

0

Jako "pseudo" progres możesz ustawić pasek postępu na marquee (chyba, pisze z telefonu) odpalić przed sql i wyłączyć po. Nie pamiętam tylko czy jest ta opcja w standardowych komponentach.

2

napiszę jeszcze raz dużymi literami - FetchProgress REAGUJE TYLKO NA AKCJĘ, KIEDY DANE SĄ POBIERANE Z BAZY DO KOMPONENTU. Nie bierze pod uwagę przygotowania danych po stronie bazy. Wobec tego BACKUP DATABASE... nie będzie zgłaszało tego eventu ponieważ ŻADNE dane nie są pobierane do komponentu. FETCH ma miejsce w poleceniach SELECT

0

Dzięki abrakadaber ale do tego doszedłem. Ale problemu nie rozwiązałem. Może mógłbyś doradzić jak zrobić ProgressBar zrzutu bazy danych na dysk ?. Nie robił bym z tego problemu ale jak baza warzy 1 gb lub więcej chwile to trwa a mielące kuleczko każdego denerwuje. Clarc doradził zęby zrobić jakiś alternatywny ProgressBar ale tego nigdzie nie mogę znaleźć "marquee".

1

Musisz skorzystać ze zdarzenia OnInfoMessage dla ADOConnection (http://docs.embarcadero.com/products/rad_studio/radstudio2007/RS2007_helpupdates/HUpdate3/EN/html/delphivclwin32/ADODB_TADOConnection_OnInfoMessage.html)
Ja w SDAC na Lazarusie obsługuję to tak:

procedure TForm1.MSConnection1InfoMessage(Sender: TObject; E: EMSError);
begin
  if (pos('percent', E.Message)>0) or (pos('procent', E.Message)>0) then
  begin
    if pos(' percent', E.Message)>0 then
    ProgressBar1.Position:=StrToInt(copy(E.Message, 1, pos(' percent', E.Message)-1))
    else
    ProgressBar1.Position:=StrToInt(copy(E.Message, pos(': ', E.Message)+2, pos(' procent', E.Message)-pos(': ', E.Message)-2));
  end;
end;
1

Witam problem rozwiązałem długo to trwało ale może komuś się przyda co prawda przeszedłem w miedzy czasie na delphi 10.2

try

sql:='BACKUP DATABASE '+CheckList[i]+' TO DISK = '+#39+EditPathBase.Text+CheckList[i]+'_'+czas+'.bak'+#39+' WITH STATS = 1';

           ADOQuery1.CursorLocation:= clUseServer;
           ADOQuery1.CursorType:=ctStatic;
           ADOQuery1.SQL.Add(sql);
           ProgressBar1.Min:=1;
           ProgressBar1.Max:=100;
           ADOQuery1.Open;

 except
         
           on E: exception  do begin

           if E.Message <> 'ADOQuery1: CommandText does not return a result set' then 
                   begin
            messagelog('Nie oczekiwany blad tworzenia pliku backup: '+E.Message,Log);
            Exit;
                   end;
            end
           end;



procedure TForm2.ADOConnection1InfoMessage(Connection: TADOConnection;
  const Error: Error; var EventStatus: TEventStatus);
begin

if StringToProgressPosition(Error.Description) > -1 then
   Form1.ProgressBar1.Position:= StringToProgressPosition(Error.Description);

end;

function TForm2.StringToProgressPosition(napis:string):integer;
var temp:string;
    wynik:integer;
    liczba:byte;
Begin
liczba:=pos(' ',napis);
temp := copy(napis, 0, liczba -1);
wynik:=StrToIntDef(temp,-1);

  result:=wynik;
End;
0

@Bartosz Mikołajczyk: jak już podajesz rozwiązanie to przynajmniej sformatuj kod, aby nie wyglądał jak wymiociny.

0
furious programming napisał(a):

@Bartosz Mikołajczyk: jak już podajesz rozwiązanie to przynajmniej sformatuj kod, aby nie wyglądał jak wymiociny.

I @Bartosz Mikołajczyk napisz wyraźnie, że to rozwiązanie nic a nic nie dotyczy tematu wątku.
Ponieważ "Jak zrobić pasek postępu gdy wykonuje się zapytanie w ADOQuery?" ma się nijak do postępu wykonania backupu przez serwer.
To są dwie zupełnie różne sprawy.

1

@wloochacz: powyższy to Twój post o numerze 666, bije z niego agresja i negatywna energia. Przypadek? ;)

screenshot-20190627123453.png

1

To pewnie dlatego, że od rana swędzi mnie lewa część [wstaw se co chcesz].
Przypadek?

Jaka agresja?

A tak w ogóle zobacz na to:
4p.png

Więcej nie znaczy lepiej ;-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1