Autor Téma: Ako vložiť 65 kB text blob  (Přečteno 1203 krát)

Offline František

  • Plnoletý
  • ***
  • Příspěvků: 247
  • Karma: 2
    • Verze Delphi: XE5, 10.1 starter (BDS2006, XE)
Ako vložiť 65 kB text blob
« kdy: 23-07-2016, 00:19:50 »
Ako vložiť 65 kB text blob (string) do firebird UTF8 DB pomocou FireDAC

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1080
  • Karma: 36
    • Verze Delphi: 7, 2010
Re:Ako vložiť 65 kB text blob
« Odpověď #1 kdy: 23-07-2016, 08:49:05 »
že by přes stream?

Offline František

  • Plnoletý
  • ***
  • Příspěvků: 247
  • Karma: 2
    • Verze Delphi: XE5, 10.1 starter (BDS2006, XE)
Re:Ako vložiť 65 kB text blob
« Odpověď #2 kdy: 26-07-2016, 00:19:54 »
to je jedina cesta?

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1080
  • Karma: 36
    • Verze Delphi: 7, 2010
Re:Ako vložiť 65 kB text blob
« Odpověď #3 kdy: 26-07-2016, 08:45:33 »
To nevím, ale co bys chtěl od datového typu "Binary large object".

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 806
  • Karma: 19
    • Verze Delphi: D2007, XE2, XE6
Re:Ako vložiť 65 kB text blob
« Odpověď #4 kdy: 26-07-2016, 08:53:19 »
Třeba nějak takto pomocí helperu

Kód: Delphi [Vybrat]
  1. {$IFDEF USE_BLOB_HELPER}
  2.  
  3. type
  4.   TDatasetBlobHelper = class helper for TDataset
  5.   public
  6.     procedure BLOB_Read(const BlobFldName: string; Data: Pointer; DataLen: Integer);
  7.     procedure BLOB_Write(const BlobFldName: string; Data: Pointer; DataLen: Integer);
  8.   end;
  9.  
  10. { TDatasetBlobHelper }
  11.  
  12. procedure TDatasetBlobHelper.BLOB_Read(const BlobFldName: string; Data: Pointer;
  13.   DataLen: Integer);
  14. var
  15.   blobF: TBlobField;
  16.   bs: TStream;
  17. begin
  18.   if not FieldByName(BlobFldName).IsBlob then Exit;
  19.  
  20.   blobF := FieldByName(BlobFldName) as TBlobField;
  21.   bs := CreateBlobStream(blobF, bmWrite);
  22.   try
  23.     bs.Write(Data^, DataLen); //<< zapise data do pole blobu
  24.   finally
  25.     bs.Free;
  26.   end;
  27. end;
  28.  
  29. procedure TDatasetBlobHelper.BLOB_Write(const BlobFldName: string; Data: Pointer;
  30.   DataLen: Integer);
  31. var
  32.   blobF: TBlobField;
  33.   bs: TStream;
  34. begin
  35.     if FieldByName(BlobFldName).IsBlob then
  36.     begin
  37.       blobF := FieldByName(BlobFldName) as TBlobField;
  38.       bs := CreateBlobStream(blobF, bmRead);
  39.       try
  40.         bs.Read(Data^, DataLen);
  41.       finally
  42.         bs.Free;
  43.       end;
  44.     end;
  45. end;
  46. {$ENDIF}

Offline František

  • Plnoletý
  • ***
  • Příspěvků: 247
  • Karma: 2
    • Verze Delphi: XE5, 10.1 starter (BDS2006, XE)
Re:Ako vložiť 65 kB text blob
« Odpověď #5 kdy: 03-08-2016, 14:49:58 »
Třeba nějak takto pomocí helperu

dakujem za radu a ozrejmenie významu a použitia helpera

ps.
Kód: [Vybrat]
type
  TXMLDocumentHelper = class helper for TXMLDocument
  public
    procedure RuInit;
  end;

  procedure TXMLDocumentHelper.RuInit;
  begin
    LoadFromFile(ExtractFilePath(Application.ExeName)+'\xml\'+Name+'.xml');
    Active;
  end;

dúfam že som pochopil správne použitie helpera (v projekte mam 4 XMLdokumenty)
« Poslední změna: 03-08-2016, 15:17:38 od František »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2738
  • Karma: 26
    • Verze Delphi: XE7 professional
Re:Ako vložiť 65 kB text blob
« Odpověď #6 kdy: 03-08-2016, 15:20:16 »
OT: ja pre získanie cesty používam
Kód: [Vybrat]
  FApplicationDir := System.SysUtils.ExtractFilePath(Application.ExeName);

  if AnsiPos('Win32', FApplicationDir) > 0 then
    FApplicationDir := Copy(FApplicationDir, 0, AnsiPos('Win32', FApplicationDir) -1);
Potom to funguje aj pod Delphi. A je jedno či v debug alebo realase móde.

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

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1270
  • Karma: 28
    • Pepak.net
Re:Ako vložiť 65 kB text blob
« Odpověď #7 kdy: 04-08-2016, 08:05:50 »
Tohle by bylo vhodné přesunout do samostatné diskuse. Moderátoři?

OT: ja pre získanie cesty používam
Kód: [Vybrat]
  FApplicationDir := System.SysUtils.ExtractFilePath(Application.ExeName);

  if AnsiPos('Win32', FApplicationDir) > 0 then
    FApplicationDir := Copy(FApplicationDir, 0, AnsiPos('Win32', FApplicationDir) -1);
Potom to funguje aj pod Delphi. A je jedno či v debug alebo realase móde.

Stando, říkat o tomhle, že to "funguje", to je tedy hodně optimistické. Jestli jsem to dobře pochopil, tak se ti jedná o defaultní případ, kdy Delphi cpou vygenerované exáče do (nějaký_adresář)\(release_nebo_debug)\(platforma), a ty se chceš zbavit té platformy. Je to tak? Pokud tano, tak to děláš naprosto špatně, tohle si můžeš dovolit pro nějakou svoji in-house utilitu, která nikdy neopustí tvůj počítač. Co když si já uživatel nainstaluju tvůj program do adresáře C:\Progs\Win32\StandovaAplikace? Je nějaký důvod, proč bych nemohl, tedy kromě toho, že mi pak tvoje aplikace přestane fungovat?

Správné řešení:

a) V Project Options nastavit Output Directory tak, aby nezohledňovalo typ releasu a platformu.

b) Pokud už vysloveně nechceš dělat a) a trváš na podobném použití, jako jsi nastínil, tak je třeba to dělat mnohem opatrněji. Například:
Kód: Delphi [Vybrat]
  1. FApplicationDir := ExtractFilePath(Application.ExeName);
  2. while (FApplicationDir <> '') and (not FileExists(FApplicationDir + 'soubor.xml')) do
  3.   FApplicationDir := ExtractFilePath(ExcludeTrailingPathDelimiter(FApplicationDir));
Eventuálně s nějakým limitem na hloubku hledání. Pokud to chceš dělat, jen pokud aplikaci spouštíš z Delphi, tak uvnitř:
Kód: Delphi [Vybrat]
  1. if DebugHook <> 0 then
Ale IMHO je to blbost.

Odhlížím teď od toho, že datové soubory patří do datových adresářů a ne přímo k exáči. Co když je uživatel bude chtít měnit?

Jinak bych ti doporučil místo Application.ExeName používat ParamStr(0) - ten je k dispozici vždycky, zatímco Application máš jen v některých typech projektů. Případně se můžeš podívat na WinApi GetModuleFileName, ale to je pro většinu použití overkill, použil bys ho u DLL knihoven.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2738
  • Karma: 26
    • Verze Delphi: XE7 professional
Re:Ako vložiť 65 kB text blob
« Odpověď #8 kdy: 04-08-2016, 08:50:37 »
Citace
a) V Project Options nastavit Output Directory tak, aby nezohledňovalo typ releasu a platformu.
Najprv by som o tom musel vedieť. A bol som rád, že som to splácal aspoň tak ako to mám ;)  Vďaka za objasnenie.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline František

  • Plnoletý
  • ***
  • Příspěvků: 247
  • Karma: 2
    • Verze Delphi: XE5, 10.1 starter (BDS2006, XE)
Re:Ako vložiť 65 kB text blob
« Odpověď #9 kdy: 04-08-2016, 09:05:09 »
alebo takto

Kód: [Vybrat]
System.SysUtils.ExtractFilePath(ParamStr(0))

 

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):