Lazarus 3.2 (2024.02.28.)
Letöltés

  • Oldal:
  • 1

TÉMA:

Válasz:Külső programok és a TProcess 2011 febr. 11 07:35 #697

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 506
  • Köszönetek: 86
Egy kis DOS alapismerettel könnyen átlátható a probléma.
A parancssorban található < szimbólumot és az utána következő részt csak a parancsértelmező tudja felhasználni (ez kb. 1980-óta így van). Az általad írt kódban a parancsértelmező nem fut, ezért annak speciális képességei sem használhatók.

Ha a parancsértelmező használatával indítod el a mysql programot akkor meg fogja kapni a 'testdata.sql' fájl tartalmát. Például:
P.CommandLine := 'cmd /c "mysql -u root -p******* --host testserver.hu tesztdb < testdata.sql"';

Lásd még: 'CMD /?'
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64

Válasz:Külső programok és a TProcess 2011 febr. 10 21:29 #696

  • ejbenjaro
  • ejbenjaro profilkép
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 66
  • Köszönetek: 4
Lehet a < jellel van problémája?
Mottó:
"Az ember sokszor más mint aminek látszik. De ritkán jobb..."
--
Gép : Asus P5G41T-M LX, Intel Celeron DC E3400, 4GB DDR3, 320GB SATA2, minden más integrált.
OS : Ubuntu 14.04
--
web: lassuviz.blogspot.hu/

Külső programok és a TProcess 2011 febr. 10 17:19 #695

  • szeti
  • szeti profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 39
  • Köszönetek: 1
Üdv Mindenkinek!

MySQL adatbázis Lazarusból indított bacup/restore funkcióit szeretném megoldani. A Bacup sikerült, mert a mysqldump.exe külső meghívásával a mellékelt programocska (TProcess használatával) elvégzi a mentést. Ugyanakkor, ha ebbe a kódba a P.CommandLine := 'mysql -u root -p******* --host testserver.hu tesztdb < testdata.sql'; sort helyettesítem be, akkor nem fut le a process. Output oldalon kiírja a MySQL helpet, ami arra utal, hogy valami miatt nem értelmezi a paraméteres futtatást. Parancssorból azonban a visszatöltés sikeres. Mi lehet a gondja a külső hívásnak, van valakinek ötlete?? Még egy infó, hogy az ExecuteProcess(), valamint az Exec() is hasonló módon lefut, de eredménytelen.
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, Process, Dos;
 
const
  READ_BYTES = 2048;
 
var
  S: TStringList;
  M: TMemoryStream;
  P: TProcess;
  n: LongInt;
  BytesRead: LongInt;  
 
begin
  M := TMemoryStream.Create;
  BytesRead := 0;
 
  P := TProcess.Create(nil);
  P.CommandLine := 'mysqldump -uroot -p******* --host testserver.hu --database testdb';
  P.Options := [poUsePipes, poStderrToOutPut];
  Memo1.Lines.Add('-- Mentés elindult! --');
  P.ShowWindow:=swoHIDE;
  P.Execute;
 
  while P.Running do
  begin
    M.SetSize(BytesRead + READ_BYTES);
 
    n := P.Output.Read((M.Memory + BytesRead)^, READ_BYTES);
    if n > 0
    then begin
      Inc(BytesRead, n);
    end
    else begin
      Sleep(100);
    end;
  end;
  repeat
    M.SetSize(BytesRead + READ_BYTES);
    n := P.Output.Read((M.Memory + BytesRead)^, READ_BYTES);
    if n > 0
    then begin
      Inc(BytesRead, n);
    end;
  until n <=0;
 
  M.SetSize(BytesRead);
  Memo1.Lines.Add('-- Mentés lefutott! --');
 
 
  Memo1.Lines.Add('-- Tárolt mentés mérete = '+IntToStr(M.Size)+' byte --');
  begin
    Memo1.Lines.Add('| '+S[n]);
  end;}
  Memo1.Lines.Add('-- Bacup file létrehozása! --');
 
  M.SaveToFile('testdata.sql');
 
  Memo1.Lines.Add('-- Mentés vége! --');
 
  P.Free;
  M.Free;
 
end;

  • Oldal:
  • 1