Autor Téma: INSERT INTO z TFDMemTable  (Přečteno 1410 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2870
  • Karma: 27
    • Verze Delphi: XE7 professional
INSERT INTO z TFDMemTable
« kdy: 18-01-2017, 15:07:03 »
Potrebujem z TFDMemTable vložiť  všetky záznamy do tabuľky. Viem to urobiť v cykle. Rád by som to mal jedným vrzom.
Kód: Delphi [Vybrat]
  1.   MemTable := TFDMemTable.Create(nil);
  2.   fdQuery_I.SQL.Text := 'INSERT INTO FOCFLATS '; // Tu by som rád mal SELECT * FROM MemTable
  3.  
Ale MemTable nie je súčasťou DB. Musím na to použiť komponenty FDCommand, FDTableAdapter?

V príkladoch nerozumiem takýmto zápisom
Kód: Delphi [Vybrat]
  1. select * from {id Orders}
  2.  
Je to CommandText v FDCommand
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline starous

  • Nováček
  • *
  • Příspěvků: 38
  • Karma: 1
Re:INSERT INTO z TFDMemTable
« Odpověď #1 kdy: 18-01-2017, 15:21:43 »
Už jsem chtěl napsat, že je to nesmysl, protože pro práci s sql příkazy potřebuješ mít nějaký databázový stroj, ale letmý pohled do nápovědy říká, že FireDac umí pro práci s tabulkami v paměti používat engine SQLite.
Podívej se na tento příklad v nápovědě: http://docwiki.embarcadero.com/CodeExamples/Berlin/en/FireDAC.TFDLocalSQL.xDBMS_Sample

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2870
  • Karma: 27
    • Verze Delphi: XE7 professional
Re:INSERT INTO z TFDMemTable
« Odpověď #2 kdy: 18-01-2017, 18:53:56 »
Zaujímavý odkaz. Ale tam sa rieši napojenie do dvoch rôznych DB ako do jednej. A je to bez TFDMemTable. Neprišiel som na to, ako to využiť v mojom prípade. Ale hľadám riešenie.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline starous

  • Nováček
  • *
  • Příspěvků: 38
  • Karma: 1
Re:INSERT INTO z TFDMemTable
« Odpověď #3 kdy: 18-01-2017, 19:45:02 »
Tak ještě jeden odkaz: http://docwiki.embarcadero.com/CodeExamples/Berlin/en/FireDAC.TFDLocalSQL_InMemDB_Sample

Když se dívám do těch zdrojáků, tak vidím následující:

  • Umístím na formulář komponenty TFDConnection, TFDLocalSQL, TFDGUIxWaitCursor, TFDPhysSQLiteDriverLink, TFDMemTable, TFDQuery
  • U komponenty typu TFDMemTable je potřeba vlastnost LocalSQL nastavit na komponentu TFDLocalSQL

Pak stačí někde definovat sloupce té tabulky, případně je naplnit:

Kód: [Vybrat]
procedure TfrmMain.FormCreate(Sender: TObject);
begin
  with FDMemTable1 do begin
    with FieldDefs do begin
      Clear;
      Add('Code', ftInteger);
      Add('Name', ftString, 20);
    end;
    Active := True;
    AppendRecord([1, 'Audi']);
    AppendRecord([2, 'BMW']);
    AppendRecord([3, 'Mercedes']);
  end;
end;

Jestli to dobře chápu, tak pak pomocí TFDQuery s tou MemTable můžeš normálně pracovat, odkazuješ se na ní názvem její komponenty. Takže pokud se komponenta TFDMemTable jmenuje FDMemTable1, použiješ například příkaz select * from FDMemTable1.


Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2870
  • Karma: 27
    • Verze Delphi: XE7 professional
Re:INSERT INTO z TFDMemTable
« Odpověď #4 kdy: 18-01-2017, 20:11:17 »
Citujem z odkazu
Citace
The sample shows how to use the TFDLocalSQL component to execute SQL commands on in-memory database, represented by several TFDMemTables.
Toto nepotrebujem. Presnejšie TFDMemTables pozná Insert, Edit, Post. Zopakujem zadanie
Citace
Potrebujem z TFDMemTable vložiť  všetky záznamy do tabuľky. Viem to urobiť v cykle. Rád by som to mal jedným vrzom.
Kód: Delphi [Vybrat]
  1. fdQuery_I.SQL.Text := 'INSERT INTO FOCFLATS SELECT * FROM MemTable';
A toto nemôže fungovať. DB nepozná MemTable.

Mne to vychádza na cyklus + batch, ktorý ponúka FireDAC.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline martinnr

  • Plnoletý
  • ***
  • Příspěvků: 127
  • Karma: 2
    • Verze Delphi: 7,2009,XE7
Re:INSERT INTO z TFDMemTable
« Odpověď #5 kdy: 19-01-2017, 08:07:15 »
ak by sa pouzila komponenta FDTable, tu napojis na existujucu tabulku v databaze, nasledne ju naplnis datami z FDMemTable (bud appendy v cykle, alebo mozno tam je funkcia aj na hromadne presunutie zaznamov jednym prikazom, nieco ako LoadFromDataset/SaveToDataset), tak by samotna FFDTable komponenta mala zabezpecit poslanie zaznamov do databazy. bud hned, ak je na FDConnection nastaveny autocommit, alebo po "rucnom" commite.
ak sa neda pouzit FDTable, tak skusit pozret ci to nevie aj FDQuery.
mam teraz len berlin starter, nic ine, kde by bolo FireDac, tak to neviem skusat naostro.

Offline Daniel_Andrascik

  • Hrdina
  • ****
  • Příspěvků: 416
  • Karma: 15
    • Verze Delphi: D2007, XE3
Re:INSERT INTO z TFDMemTable
« Odpověď #6 kdy: 19-01-2017, 08:44:12 »
Stano, pouzivas Firebird, ja som ho zatial nepouzil, tak neviem. Ale nema nahodou firebird moznost vytvarat memory tabulky, alebo temporary tabulky platne len pre aktualne pripojenie? Tak by si mohol pouzit klasikcke TFDQuery a TFDTable a nepotreboval by si TFDMemTable.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2870
  • Karma: 27
    • Verze Delphi: XE7 professional
Re:INSERT INTO z TFDMemTable
« Odpověď #7 kdy: 19-01-2017, 08:54:03 »
To martinnr: Tak by to malo ísť. Len tam treba vytvoriť aj FDTableAdapter, FDCommand a všetky tri komponenty prepojiť.

To Daniel_Andrascik: FB pozná dočasné tabuľky. Ja chcem obísť zbytočné zápisy na disk. Preto MemTable.

Ešte som nič neskúšal. Ale už je najvyšší čas. Vďaka všetkým za rady. Výsledok oznámim.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Daniel_Andrascik

  • Hrdina
  • ****
  • Příspěvků: 416
  • Karma: 15
    • Verze Delphi: D2007, XE3
Re:INSERT INTO z TFDMemTable
« Odpověď #8 kdy: 19-01-2017, 21:46:19 »
Ja len ze SQlite ma napriklad :memory: tabulku ktora pokial sa nic nezmenilo naozaj funguje len v pamati, ale netvrdim ze to maju aj ine DBs

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2870
  • Karma: 27
    • Verze Delphi: XE7 professional
Re:INSERT INTO z TFDMemTable
« Odpověď #9 kdy: 19-01-2017, 21:52:32 »
Preverím si to.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2870
  • Karma: 27
    • Verze Delphi: XE7 professional
Re:INSERT INTO z TFDMemTable
« Odpověď #10 kdy: 20-01-2017, 11:12:07 »
Citujem z návodu
Citace
Global temporary tables have persistent metadata, but their contents are transaction-bound (the default) or connection-bound.
Používa sa to v uložených procedúrach. Tadiaľ cesta nevedie.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Daniel_Andrascik

  • Hrdina
  • ****
  • Příspěvků: 416
  • Karma: 15
    • Verze Delphi: D2007, XE3
Re:INSERT INTO z TFDMemTable
« Odpověď #11 kdy: 20-01-2017, 12:05:50 »
Nie tak som myslel. Temporary table maju k dispozicii takmer vsetky RBDMS a tie su takmer vzdy ukladane na disk napriek tomu ze su docasne. RBDMS sa potom sam postara o ich vymazanie. Ale niektore databazove stroje maju este extra funkcionalitu pre tvorbu tabuliek, pripadne celych databaz priamo v RAM pamati.

Vid. SQLite  https://www.sqlite.org/inmemorydb.html

alebo MySQL http://stackoverflow.com/questions/20144394/create-table-as-select-using-memory-engine-in-ram-memory

Ale asi po 45 sekundovom patrani v googli to vyzera ze firebird zatial nepodporuje "memory storage" (minimalne do verzie 2.5) takze asi musis zostat pri TFDMemTable. S prepumpovanim dat medzi datasetmi ti neporadim, ako uz vies, nepouzivam datasety  ;)  ???

Lovu zdar...  :)

Offline vandrovnik

  • Hrdina
  • ****
  • Příspěvků: 251
  • Karma: 2
    • Verze Delphi: 10.2
Re:INSERT INTO z TFDMemTable
« Odpověď #12 kdy: 20-01-2017, 17:22:13 »
V uložené proceduře se s temporary table pracovat dá, stačí, když se procedura zavolá pod stejnou transakcí, pod kterou se s tabulkou pracuje i jinde v aplikaci.

Citujem z návodu
Citace
Global temporary tables have persistent metadata, but their contents are transaction-bound (the default) or connection-bound.
Používa sa to v uložených procedúrach. Tadiaľ cesta nevedie.

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Křestní jméno zpěváka Gotta: