Autor Téma: Ahoj používám SQLLite...a potrebuji uložit do databáze dokument *.mth  (Přečteno 6193 krát)

Offline jtfcobra

  • Plnoletý
  • ***
  • Příspěvků: 240
  • Karma: 0
    • Verze Delphi: XE4,XE5 v testovní
    • XDA Developers
Ahoj používám SQLLite...a potrebuji uložit do databáze dokument *.mth

Mám to jako soubor ted ale chtel bych to ukládat a načítat z databáze...?

Bloob jsem zkoušel a nejak mi to nešlo...

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 815
  • Karma: 59
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Promiň, že nezodpovím tvou otázku přímo.

Databáze obecně mají problémy s velkými blob poli - až ti DB trochu naroste, tak se dá předpokládat, že rychlost tabulky se soubory půjde do kytek. Proto je velmi vhodné do databáze ukládat pouze informace o souboru (velikost, název apod.) a samotné soubory ukládat do souborového systému serveru.

Jinak do BLOB by to jít mělo, jen je potřeba správně přeparsovat data na sql string (pokud tedy nepoužíváš nějakou knihovnu, která to dělá automaticky).
« Poslední změna: 03-12-2012, 21:40:55 od oxo »
Embarcadero Technology Partner

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1429
  • Karma: 34
    • Pepak.net
Ahoj používám SQLLite...a potrebuji uložit do databáze dokument *.mth
BLOB je na to nejlepší. Pokud se necítíš na to, jak to zapsat do SQL (každá databáze na to bude mít svůj specifický zápis), tak vždycky můžeš prostředky Delphi:
Kód: Delphi [Vybrat]
  1. Query := TADOQuery.Create(nil);
  2. Query.Sql.Text := 'SELECT * FROM tabulka';
  3. Query.Edit;
  4. Query.FieldByName('blobfield').AsBytes := binarnidata;
  5. Query.Post
Nebo v  případě MHT můžeš použít obyčejné stringy a stringová pole, protože MHT je obsah zakódovaný do textové podoby, dokonce obvykle sedmibitové.

Databáze obecně mají problémy s velkými blob poli - až ti DB trochu naroste, tak se dá předpokládat, že rychlost tabulky se soubory půjde do kytek.
Že se tě tak zeptám, které konkrétní databáze s tím mají "obecně" problémy? Pracuju běžně  několika a nenapadá mě žádná, kde by se bloby chovaly tak, jak popisuješ.

Citace
Proto je velmi vhodné do databáze ukládat pouze informace o souboru (velikost, název apod.) a samotné soubory ukládat do souborového systému serveru.
Taky je to mimořádně "vhodné" z hlediska udržování konzistence, při zálohování, při přesunech databáze na jiný server atd. Nemluvě o tom, že databáze jsou optimalizované na rychlé vyhledávání, zatímco filesystémy ne.

Offline leonell

  • Mladík
  • **
  • Příspěvků: 99
  • Karma: 3
>Databáze obecně mají problémy s velkými blob poli - až ti DB trochu naroste, tak se dá předpokládat, že rychlost tabulky se soubory půjde do kytek.

Dovolím si výrazně nesouhlasit, aspoň pokud to napíšeš takto obecně. To možná platí u nějakých jednoduchých "databází", ale u běžných databázových serverů to není pravda ani náhodou.

Naopak, v mnoha případech může být práce s BLOB položkou rychlejší než při čtení z filesystému.

U Informixu, abych byl konkrétní, je možné (a doporučené) vytvářet tzv blobspaces, kde jsou takováto data uložena samostatně a v datové tabulce je jenom odkaz. Tím si dále můžeš nastavt rozložení na více disků atd. Samozřejmě vše se děje interně, toto nastaví administrátor serveru a ty dáš normálně INSERT. Že on to to odkloní na jiný disk už tě nemusí zajímat.

Dále u těchto lepších serverů existují všelijaké pluginy, u Informixu nazývané DataBlades, které pak mohou "znát" obsah těch souborů a interně s nimi pracovat.
Co mně tak napadne jako příklad, tak řekněme bych mohl ukládat MP3 a mám-li DataBlade pro MP3 tak mohu z SQL dělat dotazy na ID3 tagy. Ty DataBlade se dají i programovat, je tam SDK. Tuším se to dělá v céčku, ale nikdy jsem to nedělal.

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 815
  • Karma: 59
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
>Databáze obecně mají problémy s velkými blob poli - až ti DB trochu naroste, tak se dá předpokládat, že rychlost tabulky se soubory půjde do kytek.

Dovolím si výrazně nesouhlasit, aspoň pokud to napíšeš takto obecně. To možná platí u nějakých jednoduchých "databází", ale u běžných databázových serverů to není pravda ani náhodou.

@leonell, pepak: Díky za opravení zavádějící informace, máte plnou pravdu, zobecňovat se samozřejmě nedá. Vše závisí od možností konkrétního db systému a jeho správce.
Embarcadero Technology Partner

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2586
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Ahoj používám SQLLite...a potrebuji uložit do databáze dokument *.mth
Tusim,  ze od verze 3 umi SQLite sama o sobe BLOB strcit do kazdeho sloupce bez ohledu na datovy typ, ale pokud na ni nepristupujes primo pres jeji API, asi by ses s nami mel podelit, pres co do ni lezes.

Offline geby

  • Plnoletý
  • ***
  • Příspěvků: 208
  • Karma: 16
    • Verze Delphi: 7, 2007, XE2, 10.2
    • Synapse
Nejcistsi je v Sqlite udelat sloupec typu BLOB (lhostejno, ze technicky lze BLOB nacpat do jakehokoliv druhu sloupce.... to bych sem ted netahal.) A snad vsechny wrappery pro Sqlite umi pole typu BLOB ukladat/nacitat ze streamu. Nevidim v tom zadnou zaludnost.

Dokonce i ten muj jednoduchy Sqlite wrapper to umi. ;-)

Offline jtfcobra

  • Plnoletý
  • ***
  • Příspěvků: 240
  • Karma: 0
    • Verze Delphi: XE4,XE5 v testovní
    • XDA Developers
Prosim o radu jak to dostat do Mysql

Offline jtfcobra

  • Plnoletý
  • ***
  • Příspěvků: 240
  • Karma: 0
    • Verze Delphi: XE4,XE5 v testovní
    • XDA Developers
 login2.ZConnection1.Connected:=True;
 login2.zquery1.SQL.Clear;
 login2.ZQuery1.SQL.Add('INSERT INTO skodadb (dokument) VALUES(:dokument)');
 login2.ZQuery1.ParamByName('dokument').AsBytes:=edit2.text; ?????jak tam dat soubor?
 login2.ZQuery1.ExecSQL;

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 815
  • Karma: 59
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Kód: Delphi [Vybrat]
  1. function FileAsBytes(const aFileName: String): TBytes;
  2. var
  3.   xMS: TMemoryStream;
  4. begin
  5.   xMS := TMemoryStream.Create;
  6.   try
  7.     xMS.LoadFromFile(aFileName);
  8.  
  9.     SetLength(Result, xMS.Size);
  10.     if xMS.Size > 0 then
  11.       Move(xMS.Memory^, Result[0], xMS.Size);
  12.   finally
  13.     xMS.Free;
  14.   end;
  15. end;
  16.  

Ale teď už fakt musím dělat něco užitečného :)
Embarcadero Technology Partner

Offline jtfcobra

  • Plnoletý
  • ***
  • Příspěvků: 240
  • Karma: 0
    • Verze Delphi: XE4,XE5 v testovní
    • XDA Developers
diky moc

Offline jtfcobra

  • Plnoletý
  • ***
  • Příspěvků: 240
  • Karma: 0
    • Verze Delphi: XE4,XE5 v testovní
    • XDA Developers
Jak to zapsat sem?

login2.ZConnection1.Connected:=True;
 login2.zquery1.SQL.Clear;
 login2.ZQuery1.SQL.Add('INSERT INTO skodadb (dokument) VALUES(:dokument)');
 login2.ZQuery1.ParamByName('dokument').AsBytes:=edit2.text; ??jak tam dat soubor?
 login2.ZQuery1.ExecSQL;


Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 815
  • Karma: 59
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Jak to zapsat sem?

login2.ZConnection1.Connected:=True;
 login2.zquery1.SQL.Clear;
 login2.ZQuery1.SQL.Add('INSERT INTO skodadb (dokument) VALUES(:dokument)');
 login2.ZQuery1.ParamByName('dokument').AsBytes:=edit2.text; ??jak tam dat soubor?
 login2.ZQuery1.ExecSQL;

Teď už fakt mám dojem, že si tu z nás děláš srandu...

Pokud ne, tak mi chybí údaje o tom, co to je login2, ZQuery1 a jaký typ je (...).AsBytes. Ale u toho (...).AsBytes jsem tušil TBytes. Pokud je to pravda (čti (...).AsBytes: TBytes), tak platí první věta.
Embarcadero Technology Partner

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2329
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Já používám u DB u polí které jsou BLOB něco takového:
Kód: Delphi [Vybrat]
  1. var
  2.   xMS: TMemoryStream;
  3. begin
  4.   xMS := TMemoryStream.Create;
  5.   try
  6.     xMS.LoadFromFile(aFileName);
  7.      xMS.Position := 0;
  8.      (ds.FieldByName('doExtension') AS TBlobField).LoadFromStream(xMS);
  9.   finally
  10.     xMS.Free;
  11.   end;
  12.  
  13.  

Vytvořím MemoryStream, načtu soubor, nastavím se ve streamu na začátek, a pak u Fieldu, který je BLOB načtu data ze streamu.

Pišu to částečně z praku (kromě toho načtení streamu), ale snad to bude vše.
Embarcadero MVP - Czech republic

Offline jtfcobra

  • Plnoletý
  • ***
  • Příspěvků: 240
  • Karma: 0
    • Verze Delphi: XE4,XE5 v testovní
    • XDA Developers
Ptam se asi blbe(omlouvam se ale nidky jsem to nepouzival)

 login2.ZQuery1.SQL.Add('INSERT INTO skodadb (dokument) VALUES(:dokument)');
 login2.ZQuery1.ParamByName('dokument').AsBytes:=edit2.text; ??jak sem dostanu ten stream?


Já používám u DB u polí které jsou BLOB něco takového:
Kód: Delphi [Vybrat]
  1. var
  2.   xMS: TMemoryStream;
  3. begin
  4.   xMS := TMemoryStream.Create;
  5.   try
  6.     xMS.LoadFromFile(aFileName);
  7.      xMS.Position := 0;
  8.      (ds.FieldByName('doExtension') AS TBlobField).LoadFromStream(xMS);
  9.   finally
  10.     xMS.Free;
  11.   end;
  12.  
  13.  

Vytvořím MemoryStream, načtu soubor, nastavím se ve streamu na začátek, a pak u Fieldu, který je BLOB načtu data ze streamu.

Pišu to částečně z praku (kromě toho načtení streamu), ale snad to bude vše.

Offline jtfcobra

  • Plnoletý
  • ***
  • Příspěvků: 240
  • Karma: 0
    • Verze Delphi: XE4,XE5 v testovní
    • XDA Developers
Napadlo mne takto?


Kód: Delphi [Vybrat]
  1. Procedure TForm1.Ulozenidokumentu(dokument:string);
  2. var
  3.   xMS: TMemoryStream;
  4. begin
  5.   xMS := TMemoryStream.Create;
  6.   try
  7.     xMS.LoadFromFile(dokument);
  8.      xMS.Position := 0;
  9.      (ds.FieldByName('doExtension') AS TBlobField).LoadFromStream(xMS);
  10.   finally
  11.     login2.ZConnection1.Connected:=True;
  12.     login2.zquery1.SQL.Clear;
  13.     login2.ZQuery1.SQL.Add('INSERT INTO skodadb (dokument) VALUES(:dokument)');
  14.     login2.ZQuery1.ParamByName('dokument').AsBytes:=xMS;
  15.     login2.ZQuery1.ExecSQL;
  16.     xMS.Free;
  17.   end;
  18.  
  19.  
  20.  


Ptam se asi blbe(omlouvam se ale nidky jsem to nepouzival)

 login2.ZQuery1.SQL.Add('INSERT INTO skodadb (dokument) VALUES(:dokument)');
 login2.ZQuery1.ParamByName('dokument').AsBytes:=edit2.text; ??jak sem dostanu ten stream?


Já používám u DB u polí které jsou BLOB něco takového:
Kód: Delphi [Vybrat]
  1. var
  2.   xMS: TMemoryStream;
  3. begin
  4.   xMS := TMemoryStream.Create;
  5.   try
  6.     xMS.LoadFromFile(aFileName);
  7.      xMS.Position := 0;
  8.      (ds.FieldByName('doExtension') AS TBlobField).LoadFromStream(xMS);
  9.   finally
  10.     xMS.Free;
  11.   end;
  12.  
  13.  

Vytvořím MemoryStream, načtu soubor, nastavím se ve streamu na začátek, a pak u Fieldu, který je BLOB načtu data ze streamu.

Pišu to částečně z praku (kromě toho načtení streamu), ale snad to bude vše.

Tomáš Zálešák

  • Host
uses System.IOUtils;

  login2.ZConnection1.Connected:=True;
  login2.zquery1.SQL.Clear;
  login2.ZQuery1.SQL.Add('INSERT INTO skodadb (dokument) VALUES(:dokument)');
//login2.ZQuery1.ParamByName('dokument').AsBytes:=edit2.text; ??jak tam dat soubor?
  login2.ZQuery1.ParamByName('dokument').AsBytes := TFile.ReadAllBytes(Edit2.Text); // předpokládám, že v Edit2.Text je celá cesta na soubor
  login2.ZQuery1.ExecSQL;

Offline jtfcobra

  • Plnoletý
  • ***
  • Příspěvků: 240
  • Karma: 0
    • Verze Delphi: XE4,XE5 v testovní
    • XDA Developers
Tak jsem zkoušel tohle a nejde to:

function FileAsBytes(const aFileName: String): TBytes;
var
  xMS: TMemoryStream;
begin
  xMS := TMemoryStream.Create;
  try
    xMS.LoadFromFile(aFileName);

    SetLength(Result, xMS.Size);
    if xMS.Size > 0 then
      Move(xMS.Memory^, Result[0], xMS.Size);
  finally
    xMS.Free;
  end;
end;

procedure Tadministrace.Button4Click(Sender: TObject);
begin
    login.zquery1.SQL.Clear;
    login.ZQuery1.SQL.Add('INSERT INTO skoda2013.prislusenstvi (znacka,model,nazev,soubor) VALUES(:znacka,:model,:nazev,:soubor)');
    login.ZQuery1.ParamByName('znacka').AsString:=combobox4.text;
    login.ZQuery1.ParamByName('model').AsString:=combobox5.text;
    login.ZQuery1.ParamByName('nazev').AsString:=combobox6.text;
    login.ZQuery1.ParamByName('soubor').AsBytes := fileasbytes(edit6.Text);
    login.ZQuery1.ExecSQL;
end;

Offline KarelHorky

  • Plnoletý
  • ***
  • Příspěvků: 193
  • Karma: 8
    • Verze Delphi: 7, XE6, Delphi 10.2 Tokyo
Kde a jakou to hlásí chybu ?

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4397
  • Karma: 39
    • Verze Delphi: XE7 professional
Len taký tip. Pri IB komponentoch musí mať pred prácou s parametrami Query.Close.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline jtfcobra

  • Plnoletý
  • ***
  • Příspěvků: 240
  • Karma: 0
    • Verze Delphi: XE4,XE5 v testovní
    • XDA Developers
Chyba

Pouzivam Mysql server 5.1.


Offline jtfcobra

  • Plnoletý
  • ***
  • Příspěvků: 240
  • Karma: 0
    • Verze Delphi: XE4,XE5 v testovní
    • XDA Developers
Prosim o radu...

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4397
  • Karma: 39
    • Verze Delphi: XE7 professional
Prečítaj si toto. To nevadí, že to je FB

http://forum.delphi.cz/index.php/topic,13589.0.html
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline jtfcobra

  • Plnoletý
  • ***
  • Příspěvků: 240
  • Karma: 0
    • Verze Delphi: XE4,XE5 v testovní
    • XDA Developers
Nenasel jsem tam odpoved...

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4397
  • Karma: 39
    • Verze Delphi: XE7 professional
To je škoda. Ale už len samotný predklad oznamu Ti jasne hovorí čo máš hľadať. Posielaš menej parametrov než je očakávaný.

Možnosti riešenia máš v podstate dve:

1) - najprv všetky parametre vymazať a potom ich znova vytvoriť. Za to ma silne zjazdili :D

2) - vytvoriť si samostatný komponent pre každé SQL a máš. Pokoj. Ja som svoj projekt takto prerábal dva dni. Viď aj debatu o globálnych premenných.

A musíš mať zapnuté niečo také:

ParameterCheck := True;
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.