Microsoft SQL Server 2000 Desktop Engine - Práce se soubory


Microsoft SQL Server 2000 má jako jeden z datových typů typ image, který je proměnné délky a může obsahovat až něco málo přes 2,1 GB dat (což už docela stačí) a je připraven na práci s velkými binárními daty (BLOB). Nadefinovat si tudíž správnou strukturu tabulky asi nebude problém. Problém nastane, když do něj budeme chtít soubor zapsat. A tady nám pomůže ADO objekt Stream.

Objekt Stream byl prvně představen v ActiveX Data Objects (ADO) verze 2.5. Předchozí verze vyžadovaly poměrně složitou práci s metodami GetChunk a  AppendChunk objektu Field, které umožňovaly zápis BLOB dat s fixní délkou z a do BLOB sloupce. Ovšem objekt Stream výrazně zjednodušuje práci s BLOBy a lze jej tedy využít pro vkládání, čtení a modifikaci dat v BLOB polích.

Takže máme nějakou svoji tabulku, která má třeba pole ID (binary, Identity), Nazev (varchar 50) a Obrazek (image). Jak nyní vložíme nový záznam do tabulky ?

Mějme recordset, nazvaný například sPic, který je definován jako "Select * From tblPictures". Přidání záznamu přes formulář s polem pro zadání názvu obrázku (txtNazev) a s polem pro výběr souboru včetně cesty (txtSoubor) bude vypadat následovně:

If DataEnvironment.rssPic.State=0 Then
   'Inicializace recordsetu
   DataEnvironment.sPic

Endif

'Zápis dat
With DataEnvironment.rssPic
   .AddNew
   !Nazev=txtNazev.Text
   .Update

End With

Schválně jsem neuvedl uložení souboru do pole Obrazek. To se musí totiž udělat právě pomocí objektu Stream. Nejprve si musíme proměnou typu Stream nadeklarovat, pak ji zinicializovat a pak použít. A samozřejmě musí být v projektu reference na Microsoft ActiveX Data Objects 2.5. Takže kód budeme modifikovat následovně:

'Deklarace objektu
Dim MyStream As ADODB.Stream

'Inicializace Streamu
Set MyStream = New ADODB.Stream
MyStream.Type = adTypeBinary
MyStream.Open
'Načtení souboru
MyStream.LoadFromFile txtSoubor

If DataEnvironment.rssPic.State=0 Then
   'Inicializace recordsetu
   DataEnvironment.sPic

Endif

'Zápis dat
With DataEnvironment.rssPic
   .AddNew
   !Nazev=txtNazev.Text
   !Obrazek=MyStream.Read
   .Update

End With

Nyní je celý soubor uložen se záznamem a dále si tudíž o jeho osud nemusíme dělat starosti. Samozřejmě že si jej také musíme umět přečíst a zobrazit, což bude vypadat následovně:

'Deklarace objektu
Dim MyStream As ADODB.Stream

If DataEnvironment.rssPic.State=0 Then
   'Inicializace recordsetu
   DataEnvironment.sPic

Endif
'Nedělám vyhledávání a kontroly, berme to tak že je námi požadovaný soubor v recordsetu jako první
DataEnvironment.rssPic.MoveFirst

'Inicializace Streamu
Set MyStream = New ADODB.Stream
MyStream.Type = adTypeBinary
MyStream.Open
'Načtení dat z pole
MyStream.Write DataEnvironment.rssPic!Obrazek
'Zapsání souboru na disk

MyStream.SaveToFile "cesta_se_jmenem_souboru", adSaveCreateOverWrite

A to je v podstatě vše. Objekt Stream je při načítání a zápisu soborů celkem rychlý, takže žádné velké zdržování běhu aplikace nebude (teda, na 2GB souborech sem to netestoval). Samozřejmě že kód zde uvedený není ošetřen na "blbuvzdornost", je to jenom nástřel abyste viděli, jak se BLOBy pracuje. Doufám že Vám to pomůže a budete tak dělat lepší a profesionálnější aplikace :)

 Předchozí

Autor: The Bozena