Strona 1 z 1

Dane typu BLOB

Nowy postNapisane: niedziela, 26 maja 2013, 18:42
przez sebaskow
Baza danych Access.
Komponent TADOTable


Orientujecie się może w jaki sposób "wrzucić" do bazy danych dane typu binarnego ?

Re: Dane typu BLOB

Nowy postNapisane: niedziela, 26 maja 2013, 18:50
przez Corvis
Ale co konkretnie ??

Re: Dane typu BLOB

Nowy postNapisane: niedziela, 26 maja 2013, 18:58
przez sebaskow
Jakie kolwiek dane binarne. Np. plik.

Kod: Zaznacz cały
TFileStream *strumien = new TFileStream(plik, fmOpenRead);

void *ptr;

int wielkosc  = strumien->Size;

ptr = malloc(wielkosc);

strumien->Read(ptr, wielkosc);

// - i te dane uzyskane przy pomocy strumienia chciałbym wrzucić do bazy danych.

Re: Dane typu BLOB

Nowy postNapisane: niedziela, 26 maja 2013, 19:14
przez Corvis

Re: Dane typu BLOB

Nowy postNapisane: niedziela, 26 maja 2013, 19:25
przez sebaskow
Super. Dziękuję.

Zaraz będę próbował zrobić coś po swojemu :)

Bardzo mi to pomogło.

Re: Dane typu BLOB

Nowy postNapisane: niedziela, 26 maja 2013, 19:51
przez Corvis
Jak nie ogarniesz daj znać :)

Re: Dane typu BLOB

Nowy postNapisane: środa, 29 maja 2013, 01:22
przez sebaskow
Zrobiłem to tak:

KOD cpp:     UKRYJ  
void __fastcall TForm1::Button5Click(TObject *Sender)
{
String plik;


if(OpenDialog1->Execute())
        {
        plik = OpenDialog1->FileName;
        }
else
        {
        StatusBar1->Panels->Items[0]->Text = "Nie wybrano pliku...";
        return;
        }


TFileStream *strumien = new TFileStream(plik, fmOpenRead);

Label5->Caption = IntToStr(strumien->Size) + " Byte";
Label6->Caption = IntToStr(strumien->Size / 1024) + " KByte";

int wielkosc = strumien->Size;
ptr = malloc(wielkosc);

strumien->Read(ptr, wielkosc);

Application->ProcessMessages();


TBlobField *blob;
blob = (TBlobField*)ADOTable1->FieldByName("Dane");



ADOTable1->Insert();

        blob->SetFieldType(ftBlob);
        blob->Transliterate = false;
        double start = GetTickCount();

        blob->LoadFromStream(strumien);
        ADOTable1->FieldByName("Plik")->AsString = m_plik;

ADOTable1->Post();

double koniec = GetTickCount();

koniec = koniec - start;


StatusBar1->Panels->Items[1]->Text = String().FormatFloat("# ##0.000 sek.", koniec / 1000);


delete strumien;
strumien = NULL;
free(ptr);
ptr = NULL;
}


Mam tylko taki problem:

Gdy wrzucam do bazy danych duży plik bardzo długo to trwa. i Zawiesza program.
Np. Plik 33MB wczytuje u mnie 97sek. To jest zbyt długo.
Jak należy napisać funkcję aby dane były wprowadzane sekwencyjne. ( kawałkami ) wiem jak rozdzielić plik poprzez TFileStream, ale nie wiem jak mam ten rozdzielony plik wrzucić do bazy danych ?

Re: Dane typu BLOB

Nowy postNapisane: środa, 29 maja 2013, 08:30
przez Corvis
Po jaką cholerę wrzucać do bazy takie pliki ????

Nie bardzo widzę sens żeby to robić. Nie lepiej wrzucać plik na jakiś serwer danych a do bazy samą ścieżkę do pliku ?

Re: Dane typu BLOB

Nowy postNapisane: środa, 29 maja 2013, 10:04
przez Cyfrowy Baron
Jest dokładnie tak jak pisze Corvis. Wrzucanie plików do bazy danych jest raczej pozbawione sensu.

Re: Dane typu BLOB

Nowy postNapisane: środa, 29 maja 2013, 22:50
przez sebaskow
Nie ja o tym decyduje. Tylko osoba dla której robię program.
To ma być baza danych osób. Osoby te dysponują różnymi dokumentami które mają być przechowywane w jednym miejscu, a więc w bazie danych.

Zapewne będą to arkusze excela, dokumenty worda, skany dokumentów, różnego rodzaju pisma itp...
Mogę zakładać że nie będą to jakieś wielkie pliki ale przewidzieć tego nie mogę.

Re: Dane typu BLOB

Nowy postNapisane: czwartek, 30 maja 2013, 10:24
przez Corvis
No to uświadom osobę, że to zły pomysł :) Konserwacja, wydajność tej bazy będzie masakryczna po pewnym czasie. Można to zrobić naprawdę dobrze i przenośnie nie zapisując plików w bazie :)

Np.

Zapisujesz w tabeli bazy danych ( np Ustawienia ) Główną ścieżkę gdzie znajdują się pliki na serwerze np.

X:\Dane\Pliki

Potem przy zapisywaniu danych zapisujesz tylko Folder uzytkownika i plik

\Folder Uzytkownika\PlikX.xxx

Fizycznie całość wygląda tak:

Sciezka_glowna\Pliki_uzytkownika

X:\Dane\Pliki\Folder Uzytkownika\PlikX.xxx

A Przy odczycie łączysz ścieżkę główną z plikiem. Przy przenoszeniu zmieniasz tylko główną ścieżkę X:\Dane\Pliki

Da się to zrobić bo tak robiłem i działało to super ;)

Re: Dane typu BLOB

Nowy postNapisane: czwartek, 30 maja 2013, 13:14
przez Cyfrowy Baron
Problem sprowadza się do tego, że baza danych nie jest przystosowana do przechowywania plików. Jeśli musisz je przechowywać w bazie danych w postaci binarnej to trudno, ale nie oczekuj, że zapisywanie takich plików będzie przebiegało szybko, gdyż plik musi zostać w całości przetworzony i czasu tego nie skrócisz.

Prawdziwy problem zacznie się wtedy (o czym wspomniał Corvis), gdy zamieścisz w bazie kilkaset megabajtów danych - wiem bo kiedyś też wpadłem na taki pomysł. Przetworzenie tego będzie trwało wieki...

Re: Dane typu BLOB

Nowy postNapisane: czwartek, 30 maja 2013, 13:23
przez sebaskow
Czyli rozumiem że nie jest możliwe pofragmentowanie plików i wysyłanie ich po kawałku ?

Spróbuję przekonać gościa aby przechowywać pliki w jednym miejscu a w bazie danych pozostawić tylko ścieżkę do plików. :-)

Gorzej jak będzie uparty :x

Dziękuję.

Re: Dane typu BLOB

Nowy postNapisane: czwartek, 30 maja 2013, 18:06
przez Cyfrowy Baron
sebaskow napisał(a):Czyli rozumiem że nie jest możliwe pofragmentowanie plików i wysyłanie ich po kawałku ?


Baza danych, z której korzystasz nie obsługuje takiej funkcji.



Niżej masz przykładowy plik dodany do bazy danych. Plik jednak jest przechowywany na serwerze a tutaj znajduje się tylko link z bazy danych. Zauważ, że link nie wskazuje bezpośrednio na plik, więc nie wiesz gdzie się on dokładnie znajduje i nie możesz go pobrać bezpośrednio. Plik na serwerze jest przechowywany pod nazwą 2_448749cdb069ae64aaa4ea329bfc157c - jak widać bez rozszerzenia. Spróbuj go pobrać bezpośrednio z linku, który do niego prowadzi: http://programowanie.cal.pl/forum/files/2_448749cdb069ae64aaa4ea329bfc157c!

To że plik jest przechowywany na serwerze, a nie bezpośrednio w bazie danych, nie oznacza, że można go pobrać z pominięciem bazy danych. Jeżeli jednak masz dostęp administracyjny do serwera to bez problemu dobierzesz się do takiego pliku.