FireDAC - z praxe 2

vložil Radek Červinka 29. března 2013 01:17

Druhý (a možná poslední) díl poznámek o FireDAC, tak jak na to přicházím při přechodu z ADO.

CommandTimeout a ConnectionTimeout

ConnectionTimeout se specifikuje jako parametr pro Connection, tj.

 oCon.Params.Values['LoginTimeout'] := IntToStr(iConnectionTimeout);

CommandTimeout se nastavuje jako parametr

  ResourceOptions.CmdExecTimeout := iValue * 1000; // pro ekv. hodnotu z ADO * 1000

Ale pozor: normálně je nastaveno neomezeně, ale v případné nastavení hodnoty je řízeno spouštěním vlákna, což v případě nastavení malé dávky dat je celkem hukot, kdy vlákna vznikají jak o duši.

Moje nastavení datasetu

  with FormatOptions do
  begin
    OwnMapRules := True;
    with MapRules.Add do
    begin
      SourceDataType := dtDateTimeStamp;
      TargetDataType := dtDateTime;
    end;
    with MapRules.Add do
    begin
      SourceDataType := dtTime;
      TargetDataType := dtDateTime;
    end;

    FormatOptions.StrsTrim2Len := True;    // orizni string dle Size
    FormatOptions.StrsTrim := False; // neodstranuj nadbytecne mezery
    FormatOptions.StrsEmpty2Null := False;

    UpdateOptions.RefreshMode:= rmManual; // zakaz automaticke refresh po POST
    FetchOptions.RowsetSize := 10000; // bez docitani co nejvetsi! pro rychlost
  end;

Toto mám definováno pro connection, jednotlivé datasety a spol. toto dědí. Na začátku nastavení mapování všech datumových typů na DateTime, RefreshMode mám manual protože nechci po Post reload dat a poslední položka je experimentálně zjištěno co nejrychlejší načítání dat v případě bez nastaveného dočítání.

Pro řazení jako v ADO se dá specifikovat

  FormatOptions.SortOptions := [soNullFirst, soDescNullLast];

což určuje jak se bude chovat k řazení NULL.

Datum a ms

FireDAC vrací datum včetně ms, pokud se Vám to nelíbí (BDE ani ADO to nedělá)


function dtServer: TDateTime;
var
  y, mo, d, h, m, s, ms: Word;

begin
  Result := ExecuteScalar('SELECT GetDate()');

  DecodeDate(Result, y, mo, d);
  DecodeTime(Result, h, m, s, ms);
  Result := EncodeDate(y, mo, d) + EncodeTime(h, m, s, 0);
end;

Refresh

Aktuálně používám možnost, kdy mám v jednom datasetu balík dat pro zobrazení a ten aktualizuji z jiného datasetu. Podmínkou je mít definované klíče a pak stačí použít

 ds.CopyDataSet(dsRefresh, [coRestart, coRefresh, coAppend])

což způsobí, že v cílovém DS jsou nahrazeny hodnoty pro nalezené záznamy. Pokud není nalezen záznam tak je přidán.

Podobně se dají kopírovat řádky:

 ds.CopyDataSet(dsSource, [coStructure]); //jen struktura
a pak
 ds.CopyDataSet(dsSource, [coRestart, coRefresh, coAppend]);
nebo  něco jako

  dsSource.First;
  while not dsSource.Eof do
  begin
    if xxxx then
    begin
      ds.Append;
      ds.CopyRecord(dsSource);
      ds.Post;
    end;
    dsSource.Next;
  end;

S řádky se dá různě šachovat a to nejen v případě TADMemTable, což je implementace velmi rychlé memory tabulky.


Nabízíme Delphi školení na různá témata, primárně ve Vaší firmě.

Tagy: ,

Praxe

Komentáře

29.3.2013 12:56:44 #

Daniel Andraščík

Privitam aj dalsie postrehy z praxe, tak verim ze tento clanok o FireDACu nie je posledny :)

Daniel Andraščík

29.3.2013 16:39:16 #

Daniel Andraščík

Inak na odstranovanie milisekund z oblubou pouzivam funkciu z jednotky DateUtils:

RecodeMilliSecond(const AValue: TDateTime; const AMilliSecond: Word): TDateTime;

Daniel Andraščík

1.4.2013 0:55:35 #

bullhead

...jen drobnost kterou jsem chvíli hledal, pokud používáte Firebird tak driver=IB NEbude defaultně fungovat. Do "ADDrivers.ini" v instalaci Firedacu, který je defatulně prázdný, dodejte tyto dva řádky, ať při kompilaci počítá z jinou knihovnou:

[IB]
VendorLib=fbclient.dll

...pokud DLL máte v systémové cestě, jinak je tam třeba dát z plnou cestou.
B.

bullhead

Komentování ukončeno

Naše nabídka

Partial English version.

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy nebo burzy práce).

Pokud chcete podpořit tento server libovolnou částkou, můžete použít PayPal. Moc děkuji.

Delphi Certified Developer

O Delphi.cz

Delphi je jediný moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64 , Mac OSX a na iPhone a Android (s výhledem na další platformy díky FireMonkey) na současném trhu (včetně Windows 8.1).

V současnosti je světová komunita přes dva miliónů vývojářů.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Anketa

Poslední komentáře

Comment RSS