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

Offline dee

  • Plnoletý
  • ***
  • Příspěvků: 116
  • Karma: 0
    • Verze Delphi: D7, XE7
vlozenie obrazku do db
« kdy: 11-06-2016, 10:15:23 »
ahojte, ako mozem nahrat obrazok do databazy ? teda mam bmp obrazok a chem ho insertnut do db tak aby som ho mohol prehliadat cez dbimage ? a ake formaty obrazkov delphi podporuje ?
dik

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2735
  • Karma: 26
    • Verze Delphi: XE7 professional
Re:vlozenie obrazku do db
« Odpověď #1 kdy: 12-06-2016, 17:23:34 »
Nikto nereaguje a ja som to nikdy nerobil :)  ale niečo skúsim z cudzích hláv.
Citace
ako mozem nahrat obrazok do databazy ? teda mam bmp obrazok a chem ho insertnut do db tak aby som ho mohol prehliadat cez dbimage ? a ake formaty obrazkov delphi podporuje ?
Najlepšie cez USB ;D
A teraz vážne. Nedal si žiadnu technickú informáciu. Aká DB, ktoré Delphi...
Na takéto účely slúži pole typu BLOB. Keď som niekde niečo pozeral ohľadom DB, tak skoro vždy som narazil na ukážku práce s obrázkami. Ty nie?
Keďže práca s poliami typu BLOB nebýva práve najjednoduchšia a obrázky zvyknú veľmi zväčšovať DB, tak sa používa iná technika.

Obrázky si uložíš na disk a do DB si vložíš odkaz na ne. Potom si ich v programe načítaš priamo zo súborov.
A tie podporované formáty si si mohol dávno pozrieť. Tak lenivý nie som ani ja ;)


Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline dee

  • Plnoletý
  • ***
  • Příspěvků: 116
  • Karma: 0
    • Verze Delphi: D7, XE7
Re:vlozenie obrazku do db
« Odpověď #2 kdy: 12-06-2016, 18:25:09 »
ide o sqlite a chcem ich davat do toho blobu. natiahnut ich viem to je pekne ulazane v deme fishfact ale ako ich tam dostat to uz nie.
na nete su nejake clanky ale castokrat mi to pride akesi komplikovane

Offline mjseven

  • Mladík
  • **
  • Příspěvků: 63
  • Karma: 5
    • Verze Delphi: D7, D2006, XE2, Lazarus
Re:vlozenie obrazku do db
« Odpověď #3 kdy: 13-06-2016, 10:10:07 »
Jak je nahrát do DB záleží na tom jaké používáš komponenty nebo wrapper pro připojení.
Musí podporovat práci s Blob sloupci. Bez konkrétních informací jak se k SQLite připojuješ ti víc poradit nikdo nedokáže.

Každopádně u SQLite bych spíš použil variantu kdy jsou obrázky uloženy ve složce na disku a do DB ukládal jen cestu k obrázku.



Offline dee

  • Plnoletý
  • ***
  • Příspěvků: 116
  • Karma: 0
    • Verze Delphi: D7, XE7
Re:vlozenie obrazku do db
« Odpověď #4 kdy: 13-06-2016, 18:27:52 »
pouzivam firedac, ale ved blob by mal byt vsade to iste, len ako natiahnut binarne data z obrazku a nasukat to insertom do blobu tak aby sa to korektne ulozilo a dalo znovu precitat

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 1687
  • Karma: 69
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:vlozenie obrazku do db
« Odpověď #5 kdy: 14-06-2016, 10:20:05 »
Ukladat obrazky zvlast na disku je blbost a pozustatek z 90 let.

Standartne obrazky jenom BMP, pokud das do uses pngimage nebo jpegimage tak i PNG, JPG.

Nejjednodussi je  nacist do nejakeho streamu a pak je postnout do DB. Funguje u vsech DB podporovanych Delphi. Vsechno odstatni je zbytecne slozite.

Kód: [Vybrat]

uses db;
...
var
  ms:TMemoryStream;

begin
  ms := TMemoryStream.Create;
  try
    ms.LoadFromFile('nejaky obrazek png, bmp, jpg');
    ms.position := 0; // nastav se ve streamu na zacatek
 
    fdquery.SQL.Text := 'SELECT id, data FROM tabulkaobrazku WHERE id = 10'; // nebo AdoQuery nebo co pouzivas
    fdquery.Open;
      fdquery.Edit;
      (ads.FieldByName('data ') as TBlobField).LoadFromStream(ms); // nacti BLOB z memory streamu do Fieldu
      fdquery.Post; // postni data
      fdquery.Close;
    finally
      ms.Free;
    end;
Embarcadero MVP - Czech republic

Offline oxo

  • Guru
  • *****
  • Příspěvků: 686
  • Karma: 39
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:vlozenie obrazku do db
« Odpověď #6 kdy: 14-06-2016, 20:47:17 »
Ten TMemoryStream je zbytečný, lepší je TFileStream. Netřeba to tahat přes paměť. (Ale to je jen hnidopišství, za které mě omluv  :) )
Embarcadero Technology Partner, juj. Člen Lazarus týmu, oj.

Offline vandrovnik

  • Plnoletý
  • ***
  • Příspěvků: 236
  • Karma: 2
    • Verze Delphi: 10.2
Re:vlozenie obrazku do db
« Odpověď #7 kdy: 14-06-2016, 21:01:07 »
Ukladat obrazky zvlast na disku je blbost a pozustatek z 90 let.

S tím nesouhlasím - pokud máte fotek pár (desítek) GB a dáte je všechny do databáze, bude to komplikovat život např. při zálohování, protože co záloha, to další kopie těch fotek...

Offline dee

  • Plnoletý
  • ***
  • Příspěvků: 116
  • Karma: 0
    • Verze Delphi: D7, XE7
Re:vlozenie obrazku do db
« Odpověď #8 kdy: 15-06-2016, 07:46:19 »
Ukladat obrazky zvlast na disku je blbost a pozustatek z 90 let.

Standartne obrazky jenom BMP, pokud das do uses pngimage nebo jpegimage tak i PNG, JPG.

Nejjednodussi je  nacist do nejakeho streamu a pak je postnout do DB. Funguje u vsech DB podporovanych Delphi. Vsechno odstatni je zbytecne slozite.

Kód: [Vybrat]

uses db;
...
var
  ms:TMemoryStream;

begin
  ms := TMemoryStream.Create;
  try
    ms.LoadFromFile('nejaky obrazek png, bmp, jpg');
    ms.position := 0; // nastav se ve streamu na zacatek
 
    fdquery.SQL.Text := 'SELECT id, data FROM tabulkaobrazku WHERE id = 10'; // nebo AdoQuery nebo co pouzivas
    fdquery.Open;
      fdquery.Edit;
      (ads.FieldByName('data ') as TBlobField).LoadFromStream(ms); // nacti BLOB z memory streamu do Fieldu
      fdquery.Post; // postni data
      fdquery.Close;
    finally
      ms.Free;
    end;


dik, inak co si to tie streamy vlastne ?  a ako sa pouzivaju, .... nejaka teoria, nerad pouzivam veci ktore nepoznam ? neslo by namiesto streamu pouzit napriklad obycajny stringlist ?

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2735
  • Karma: 26
    • Verze Delphi: XE7 professional
Re:vlozenie obrazku do db
« Odpověď #9 kdy: 15-06-2016, 07:50:47 »
Citace
dik, inak co si to tie streamy vlastne ?
Ty nemáš internet?
Citace
a ako sa pouzivaju, .... nejaka teoria, nerad pouzivam veci ktore nepoznam
Tak si to naštuduj. To za Teba nikto neurobí.
A keby si nevedel, tak stačí dať kurzor na daný výraz a stlačiť F1. Máš Ty ale šťastie, že reagujem ako prvý ja, taký pohoďák ;D
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 1687
  • Karma: 69
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:vlozenie obrazku do db
« Odpověď #10 kdy: 15-06-2016, 08:23:08 »
dik, inak co si to tie streamy vlastne ?  a ako sa pouzivaju, .... nejaka teoria, nerad pouzivam veci ktore nepoznam ? neslo by namiesto streamu pouzit napriklad obycajny stringlist ?

To si děláš srandu ne? Než se zeptám, tak je elementární slušnost prokázat že jsi tomu věnoval nějaký čas a ptáš se už aspoň se základní představou VOCOGO, což v tomto případě evidentně smůla. To fakt čekáš, že ti někdo bude přihrávat všechno až pod nos?

Jinak jak se používají streamy je jasné z toho co jsem napsal, případně co poznamenal oxo.
Embarcadero MVP - Czech republic

Offline František

  • Plnoletý
  • ***
  • Příspěvků: 247
  • Karma: 2
    • Verze Delphi: XE5, 10.1 starter (BDS2006, XE)
Re:vlozenie obrazku do db
« Odpověď #11 kdy: 16-06-2016, 07:51:52 »
Citace
To si děláš srandu ne? Než se zeptám, tak je elementární slušnost prokázat že jsi tomu věnoval nějaký čas a ptáš se už aspoň se základní představou VOCOGO, což v tomto případě evidentně smůla. To fakt čekáš, že ti někdo bude přihrávat všechno až pod nos?
všetci sme nejako začínali

ale toto: ja práve uvažujem o vkladaní videí do DB (cca 60MB jedno) ... je to stale vhodné, alebo radšej použiť pozostatok z 90. let - dôvod? aby si ich užívateľ nemohol ľahko skopírovať
« Poslední změna: 16-06-2016, 07:56:04 od František »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2735
  • Karma: 26
    • Verze Delphi: XE7 professional
Re:vlozenie obrazku do db
« Odpověď #12 kdy: 16-06-2016, 08:34:33 »
Môžeš použiť aj šifrovanie. Ale netuším koľko času by si to žiadalo na jeden súbor.
Alebo spakovať, či sa zmení veľkosť neviem ??? , pod heslom.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1744
  • Karma: 77
    • Verze Delphi: D2007, XE3, DX10
Re:vlozenie obrazku do db
« Odpověď #13 kdy: 16-06-2016, 08:52:38 »
všetci sme nejako začínali
To sem snad ani nepis...

Citace
ale toto: ja práve uvažujem o vkladaní videí do DB (cca 60MB jedno) ... je to stale vhodné, alebo radšej použiť pozostatok z 90. let - dôvod? aby si ich užívateľ nemohol ľahko skopírovať
Vyclenenim dat mimo DB si zadelavas na problemy a nemam s tim dobre zkusenosti:

- Emajlovy klient Opera - v DB si drzel rejstrik zprav a pak mel v adresarove strukture soubory s MIME obsahem, 1 emajl - 1 soubor. A pri jedne aktualizaci, kdy vyclenili emajl z browseru, se jim to nejak posr*lo a pres veskerou moji snahu to nejak zotavit jsem prisel o emajly za nekolik let - teda zustaly mi ty MIME soubory, ale do klienta uz jsem je zpatky nedostal => zanevrel jsem definitivne na Operu a presel na Thunderbird

- vlastni zkusenost: mam webovou aplikaci, ktera exportuje ruzne reporty napr. v XLS, ktere si BFU stahne do browseru a ma je u sebe v download folderu. A na strane serveru jsem udelal jejich archiv: v DB mam rejstrik exportu pristupny pres web a pool souboru na disku, odkud si je BFU muze znovu stahnout. Ale jsou s tim organizacni problemy: kdyz nekomu v teamu davam napr. novejsi DB, tak musim pamatovat, ze mu k tomu musim dat i ty soubory a on si je musi dat na server na spravne misto... V provozu na webovem serveru s pravidelnou zalohou to nicemu vadit nebude.

Osobne bych preferoval BLOB v DB, pokud je to s ohledem na objemy dat mozne

Offline mics

  • Nováček
  • *
  • Příspěvků: 5
  • Karma: 0
    • Verze Delphi: XE, 10.1 Berlin
Re:vlozenie obrazku do db
« Odpověď #14 kdy: 16-06-2016, 12:38:27 »
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).

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 1687
  • Karma: 69
    • 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ů: 116
  • Karma: 0
    • 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ů: 1265
  • 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ů: 116
  • Karma: 0
    • 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

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2735
  • Karma: 26
    • 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ů: 116
  • Karma: 0
    • 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

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2735
  • Karma: 26
    • 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ů: 116
  • Karma: 0
    • 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 »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2735
  • Karma: 26
    • 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ů: 1744
  • Karma: 77
    • 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ů: 116
  • Karma: 0
    • 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ů: 122
  • 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í:
Datový typ v Delphi, který má True a False: