Autor Téma: vlozenie obrazku do db  (Přečteno 4644 krát)

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 1795
  • Karma: 72
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:vlozenie obrazku do db
« Odpověď #15 kdy: 16-06-2016, 23:25:52 »
My ukládáme soubory do filesystemu a žádné problémy s tím nejsou, naopak.  V DB je udržován seznam souborů, tzn. DB je primární "zdroj" pro metadata, do filesystemu se šahá už pouze pro fyzický soubor. Důvodem proč to použít jsou jednoznačně objemy dat při zálohování, kdy filesystem (v našem případě) stačí zálohovat inkrementálně, zatímco záloha DB se může verzovat.

Určitě bych to nenazýval návratem do 90. let. Má to prostě svoje výhody i nevýhody (jako vše).

Jen tak pro zajímavost:
- Jak řešíte bezpečnost, tj, aby si někdo ty data nezkopíroval z disku? A když si je zkopíruje, tak předpokládám, že budou dostatečně šifrované aby si je nepřečetl, že?
- Jak řešíte přístup z více míst, tj. např. transakční zpracování? Jako že někdo vkládá data, součástí toho je aktualizace souboru  a pak nepotvrdí transakci? Případně vícenásobné čtení (třeba i se zápisem) a takové podobné legrácky. Nebo to máte všechny soubory ReadOnly? Nebo se jedná o jednouživatelský přístup?
- Jak řešíte přístup vůbec, tj. mám klienta, jak ty data dostane? To máte asi aplikační server, který to nějak distribuuje a zároveň řeší vícenásobný přístup? Nebo to máte přes webový server?

Ptám se jen pro zajímavost, a opravdu mne to celkem zajímá (takové věci jako replikaci, ba ani práva zápisu, práva souboru po novém vytvoření a další ani neřeším) - to jsou některé z důvodů, proč jsem třeba já třeba jasně řekl ne a vyjímka je snad, když je nutné použít nějaký SQL server (NoSQL se pořád odhodlávám), který má nějaké limity.
Ještě bych to pochopil u lokálních aplikací. Ale všechno je to IMHO a nikomu to netlačím.
Embarcadero MVP - Czech republic

Offline mics

  • Nováček
  • *
  • Příspěvků: 5
  • Karma: 0
    • Verze Delphi: XE, 10.1 Berlin
Re:vlozenie obrazku do db
« Odpověď #16 kdy: 17-06-2016, 10:08:38 »
Je to tak jak píšeš - je tam aplikační server, který jediný přistupuje do toho úložiště dokumentů, čímž je zaručeno to, že si to nikdo neodnese/nezmění apod.
Všechny dokumenty jsou verzované, tzn. k jednomu souboru (uživatelsky) máme x-verzí v úložišti. Tím pádem soubor se vždy nahrává do úložiště pouze jednou a je publikován uživatelům až ve chvíli, kdy je v pořádku nahraný. A potom už se nemění, vždy se vytváří nový soubor jako nová verze. Pokud se upload nepovede, nic se neděje, je v DB označený, že není kompletní a uživatelé ho nevidí. Ale to se stává relativně málo.

« Poslední změna: 17-06-2016, 10:10:11 od mics »

Offline dee

  • Plnoletý
  • ***
  • Příspěvků: 117
  • Karma: 1
    • Verze Delphi: D7, XE7
Re:vlozenie obrazku do db
« Odpověď #17 kdy: 31-08-2016, 21:12:41 »
No ale ako to mam teda urobit, uz som sa sice pytal v kategorii FireMonkey ale stale som sa nedopatral k funkcemu rieseniu
Kód: [Vybrat]
ms:=TMemoryStream.Create;
ms.Position:=0;
image1.Bitmap.SaveToStream(ms);
ms.Position:=0

FDStoredProc1.ParamByName('@img').LoadFromStream(ms,ftBlob);
Toto skonci AccesViolation prave na tom poslednom riadku .... teda ked chcem natiahnut parameter zo streamu

Skusil som natiahnut obrazok priamo z disku ...
Kód: [Vybrat]
FDStoredProc1.ParamByName('@img').LoadFromFile('C:\f\1.jpg',ftBlob);
Ale skonci to chybovou hlaskou  Stream read error !


Offline pepak

  • Guru
  • *****
  • Příspěvků: 1299
  • Karma: 28
    • Pepak.net
Re:vlozenie obrazku do db
« Odpověď #18 kdy: 01-09-2016, 05:51:36 »
Kód: Text [Vybrat]
  1. FDStoredProc1.ParamByName('@img').LoadFromStream(ms,ftBlob);
Toto skonci AccesViolation prave na tom poslednom riadku .... teda ked chcem natiahnut parameter zo streamu
1) Tento řádek znamená, že zapisuješ stream do parametru.
2) Kdyby sis sem dal breakpoint a podíval se na obsah jednotlivých proměnných, se kterými pracuješ, zjistíš, že buď FDStoredProc1 nebo FDStoredProc1.ParamByName('@img') vrací nil.

Citace
Skusil som natiahnut obrazok priamo z disku ...
Kód: Delphi [Vybrat]
  1. FDStoredProc1.ParamByName('@img').LoadFromFile('C:\f\1.jpg',ftBlob);
Ale skonci to chybovou hlaskou  Stream read error !
Důvod bude identický jako v #2 výše.

Offline dee

  • Plnoletý
  • ***
  • Příspěvků: 117
  • Karma: 1
    • Verze Delphi: D7, XE7
Re:vlozenie obrazku do db
« Odpověď #19 kdy: 01-09-2016, 07:05:22 »
ta FDStored proc sa v mojom konkretnom pripade vola sp_InsertOp dal som tam breakpoint a NIL to nieje



Takisto aj ten parameter, inak ta storka normalne funguje, ma aj ine parametre jediny problem je ak sa pokusim naplnit parameter img1

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3022
  • Karma: 29
    • Verze Delphi: XE7 professional
Re:vlozenie obrazku do db
« Odpověď #20 kdy: 01-09-2016, 09:10:59 »
Možno budem za blbca, ale nevadí.
'@img1' je obyčajný textový reťazec. Neverím, že máš parametre s takými názvami.
@img1 - znak @ má špeciálny význam. Podľa toho kde to použiješ.
Citace
Takisto aj ten parameter, inak ta storka normalne funguje, ma aj ine parametre jediny problem je ak sa pokusim naplnit parameter img1
Už táto veta hovorí, že máš parameter img1. Vyjasni si rozdiel medzi pojmami a dojmami a zistíš, kde máš chybu. Prípadne sem hoď definíciu SP. ALE NIE AKO OBRÁZOK!
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline dee

  • Plnoletý
  • ***
  • Příspěvků: 117
  • Karma: 1
    • Verze Delphi: D7, XE7
Re:vlozenie obrazku do db
« Odpověď #21 kdy: 01-09-2016, 10:19:54 »
Pravdepodobne si nerozumieme
Parametre si Delphi vygenerovalo automaticky. Ta SPje napojena na aktívne FDConnection.

Tento kód funguje uplne bezchybne !
Kód: [Vybrat]
  sp_InsertOp.Close;

  sp_InsertOp.ParamByName('@price').Value:=NumberBox1.Value;
  sp_InsertOp.ParamByName('@title').Value:=Edit1.Text;
  sp_InsertOp.ParamByName('@description').Value:=Memo1.Text;
  //sp_InsertOp.ParamByName('@img1').LoadFromFile('C:\f\1.jpg',ftBlob);

  sp_InsertOp.OpenOrExecute;


Ak odkomentujem to natiahnutie obrázku tak to padne práve na tom riadku chybou Stream read error

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3022
  • Karma: 29
    • Verze Delphi: XE7 professional
Re:vlozenie obrazku do db
« Odpověď #22 kdy: 01-09-2016, 17:52:59 »
Pokračujem v blbcovi.
V takýchto prípadoch idem na to metódou pokus - omyl.
Citace
Ak odkomentujem to natiahnutie obrázku tak to padne práve na tom riadku chybou Stream read error
Tak si samostatne niekde bokom vyskúšam len načítanie. Ak funguje, tak sa pozriem na samotnú SP. Urobil si to?

Keď som ja skúšal SqlLite, tak tam bolo jednoznačne napísané, a odkazy to potvrdili, že všetky údaje sú uložené ako string. Bez ohľadu na ich definíciu. Aj preto som sa SqlLite vzdal.
Citace
Parametre si Delphi vygenerovalo automaticky. Ta SPje napojena na aktívne FDConnection.
To mi je cudzie. Všetko si generujem v runtime. A názvy parametrov beriem zo samotných definícii. Preto som požadoval jej uverejnenie.
V diskusii vidím takéto odporúčanie
Kód: [Vybrat]
(ads.FieldByName('data') as TBlobField).LoadFromStream(ms); // nacti BLOB z memory streamu do FielduSkúsil si to?
Osobne by som použil sp_InsertOp.Execute; pretože je tu jasné čo chceš urobiť! Nevyberáš si medzi dvoma možnosťami.

Ono automatické veci sú pekná vec, ale sú s tým občas problémy. Hlavne ak tomu nerozumieme :) . Už som/ma sa tu naučil/i, že je lepšie písať viac kódu a mať všetko pod kontrolou. Napr. aj preto som v aplikácii povyhadzoval všetky AutoCommit-y, okrem SELECT-ov. Už len vyriešiť takú nepodstatnú drobnosť akou je ošetrenie výnimiek DB ;D
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline dee

  • Plnoletý
  • ***
  • Příspěvků: 117
  • Karma: 1
    • Verze Delphi: D7, XE7
Re:vlozenie obrazku do db
« Odpověď #23 kdy: 01-09-2016, 18:02:56 »
Kód: [Vybrat]
(ads.FieldByName('data') as TBlobField).LoadFromStream(ms); // nacti BLOB z memory streamu do Fieldu
-- ale ja nepotrebujem nacitat Field ale Param
takato uprava neprejde cez kompilator
Kód: [Vybrat]
  (sp_InsertOp.ParamByName('@img1') as TBlobField).LoadFromStream(ms);
[dcc32 Error] unewoperation.pas(109): E2010 Incompatible types: 'TFDParam' and 'TBlobField'

Inak pre uplnost v tomto pripade ide o MS-SQL 2014
« Poslední změna: 01-09-2016, 18:10:03 od dee »

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3022
  • Karma: 29
    • Verze Delphi: XE7 professional
Re:vlozenie obrazku do db
« Odpověď #24 kdy: 01-09-2016, 20:50:38 »
Kód: [Vybrat]
ale ja nepotrebujem nacitat Field ale Param :D :D :D  Ty nenačítavaš Field ani Parameter, ale obsah súboru. A ten sa snažíš priradiť do SP cez parameter. A máš to jasne napísané v poznámke >:(
Kód: [Vybrat]
(sp_InsertOp.ParamByName('@img1') as TBlobField).LoadFromStream(ms);
tak tam vyhoď časť " as TBlobField". Mal by si vedieť čo to znamená. Ja osobne používam parametre takto:
Kód: [Vybrat]
sp_InsertOp.ParamByName('@title').AsString := Edit1.Text;
Čiže mu priamo určím typ parametra. Použitie Value vyvolá reťazec akcií navyše. Zistenie aký typ je parameter - pretypovanie priradzovanej hodnoty, ak sa dá.
Citace
Inak pre uplnost v tomto pripade ide o MS-SQL 2014
Ale píšeš o SqlLite!!!
Citace
FDStoredProc1.ParamByName('@img').LoadFromStream(ms,ftBlob);

Toto skonci AccesViolation prave na tom poslednom riadku .... teda ked chcem natiahnut parameter zo streamu
1) Tento řádek znamená, že zapisuješ stream do parametru.
2) Kdyby sis sem dal breakpoint a podíval se na obsah jednotlivých proměnných, se kterými pracuješ, zjistíš, že buď FDStoredProc1 nebo FDStoredProc1.ParamByName('@img') vrací nil.
Vysvetlenie bodu 2), aj keď je napísaný úplne jasne: v ľavom okraji si urobíš takú červenú bodku (veľkú). Spustíš program a on na nej zastaví. Potom si postupne nabehneš myšou na jednotlivé "slová" riadku a budeš poriadne čítať čo sa Ti objaví. Ak tam bude aj + tak sa naň presuň kurzorom a študuj ďalej. Ja pepakovi verím ;)
Keďže som s BLOB ani s grafikou v DB nikdy nepracoval, tak viac poradiť neviem. A už ani nemám chuť lebo:

Nedávaš správne ani úplné informácie. Napríklad či to načítanie súboru funguje. O čosi som Ťa požiadal a Ty si to ignoroval (2x). Tvoj názor, že to podľa Teba nie je podstatné/zaujímavé je mylný. Dúfam, že si si aspoň o tom BLOB v MS-SQL 2014 prečítal všetko čo je prístupné. Každá DB to má ináč. FireDAC je síce prepracovaný ale nie všemožný.
« Poslední změna: 01-09-2016, 20:58:02 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1893
  • Karma: 96
    • Verze Delphi: D2007, XE3, DX10
Re:vlozenie obrazku do db
« Odpověď #25 kdy: 01-09-2016, 21:35:03 »
Kód: [Vybrat]
FDStoredProc1.ParamByName('@img').LoadFromStream(ms,ftBlob);
Toto skonci AccesViolation prave na tom poslednom riadku .... teda ked chcem natiahnut parameter zo streamu
Podle me ten BLOB predavas hodnotou spravne. Zkus se podivat, jestli to neni stejna chyba jako tady https://forums.embarcadero.com/message.jspa?messageID=677971. Chce to trasovat dovnitr, abys zjistil, proc to nefunguje. Taky muzes overit, jestli DataType u toho parametru je ftBlob a jestli ParamByName() vrati skutecne parametr.

Take muzes zkusit ten stream predat jako stream a ne hodnotou viz http://docwiki.embarcadero.com/RADStudio/Berlin/en/Support_for_Blob_Streaming_in_FireDAC
(kdy konecne zacnes pouzivat dokumentaci a google  >:( )

Offline dee

  • Plnoletý
  • ***
  • Příspěvků: 117
  • Karma: 1
    • Verze Delphi: D7, XE7
Re:vlozenie obrazku do db
« Odpověď #26 kdy: 02-09-2016, 05:39:03 »
To predavanie ako Stream pomohlo  :)

Kód: [Vybrat]
  sp_InsertOp.ParamByName('@img1').AsStream:=ms;
Toto funguje perfektne !  ;)
Dakujem  :)
« Poslední změna: 02-09-2016, 06:01:57 od dee »

Offline martinnr

  • Plnoletý
  • ***
  • Příspěvků: 138
  • Karma: 2
    • Verze Delphi: 7,2009,XE7
Re:vlozenie obrazku do db
« Odpověď #27 kdy: 02-09-2016, 08:28:53 »
Či už ukladanie do súborov na disku, alebo priamo do databázy, každé má svoje výhody, aj nevýhody.
V prípade databázy to z dôvodov jednoduchšieho zálohovania a prípadne veľkosti/rýchlosti databázy, môže byť samostatný súbor-databáza, s jednou tabuľkou len pre tie obrázky. samozrejme záleží na použití...

čo sa týka toho streamu, tak len preklad hovorí to, že je to akýsi tok. tok dát. a v podstate ide o súvislý tok binárnych (vo svojej podstate) dát. v delphi existujú rôzne typy - tstringstream, tmemorystream, tfilestream a ďalšie. podľa názvu je jasné na čo a kedy sa používajú, a podľa svojho typu potom majú ďalšie vlastnosti a funkcie.
robí sa s nimi celkom ľahko a veľa ďalších objektov (komponenty, triedy, ...) majú v sebe funkcie na prácu s nimi. Napr. xx.SaveToStream, xx.LoadFromStream. atd.
ale ako bolo napísané, treba googliť, resp. používať help.

 

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í:
Kolik je šest plus čtyři (slovem):