Dane typu BLOB

Problemy związane z tworzeniem i zarządzaniem programami bazo-danowymi.
Regulamin działu


Zadając pytania dotyczące baz danych należy podawać szczegółowe informacje o bazie danych nad którą się pracuje, czyli:

  • Rodzaj serwera bazodanowego: MySql, MSSQL, Oracle itp.
  • Wersja bazy danych
  • Technologia bazodanowa używana w programie: ADO, DbExpress, InterBase
  • Komponenty użyte do zestawienia połączenia: ADOConnection, SqlConnection
  • Sposób zestawienia komponentów bazodanowych np. DataSet - DataSource - DbGrid lub DataSet - DataSetProvider - ClientDataSet - DataSource - DbGrid
  • Jeżeli używane były biblioteki innych firm niż Borland, CodeGeer i Embarcadero proszę podać ich nazwy, numer wersji i adres źródła.

Dane typu BLOB

Nowy postprzez sebaskow » niedziela, 26 maja 2013, 18:42

Baza danych Access.
Komponent TADOTable


Orientujecie się może w jaki sposób "wrzucić" do bazy danych dane typu binarnego ?
Avatar użytkownika
sebaskow
Intelektryk
Intelektryk
 
Posty: 135
Dołączył(a): wtorek, 3 maja 2011, 08:30
Lokalizacja: Katowice
Podziękował : 10
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++ Builder XE7
Gadu Gadu: 0
    Windows 7Firefox

Re: Dane typu BLOB

Nowy postprzez Corvis » niedziela, 26 maja 2013, 18:50

Ale co konkretnie ??
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome

Re: Dane typu BLOB

Nowy postprzez sebaskow » niedziela, 26 maja 2013, 18:58

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.
Avatar użytkownika
sebaskow
Intelektryk
Intelektryk
 
Posty: 135
Dołączył(a): wtorek, 3 maja 2011, 08:30
Lokalizacja: Katowice
Podziękował : 10
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++ Builder XE7
Gadu Gadu: 0
    Windows 7Firefox

Re: Dane typu BLOB

Nowy postprzez Corvis » niedziela, 26 maja 2013, 19:14

"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House

Za ten post autor Corvis otrzymał podziękowanie od:
sebaskow
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome

Re: Dane typu BLOB

Nowy postprzez sebaskow » niedziela, 26 maja 2013, 19:25

Super. Dziękuję.

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

Bardzo mi to pomogło.
Avatar użytkownika
sebaskow
Intelektryk
Intelektryk
 
Posty: 135
Dołączył(a): wtorek, 3 maja 2011, 08:30
Lokalizacja: Katowice
Podziękował : 10
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++ Builder XE7
Gadu Gadu: 0
    Windows 7Firefox

Re: Dane typu BLOB

Nowy postprzez Corvis » niedziela, 26 maja 2013, 19:51

Jak nie ogarniesz daj znać :)
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome

Re: Dane typu BLOB

Nowy postprzez sebaskow » środa, 29 maja 2013, 01:22

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 ?
Avatar użytkownika
sebaskow
Intelektryk
Intelektryk
 
Posty: 135
Dołączył(a): wtorek, 3 maja 2011, 08:30
Lokalizacja: Katowice
Podziękował : 10
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++ Builder XE7
Gadu Gadu: 0
    Windows VistaChrome

Re: Dane typu BLOB

Nowy postprzez Corvis » środa, 29 maja 2013, 08:30

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 ?
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome

Re: Dane typu BLOB

Nowy postprzez Cyfrowy Baron » środa, 29 maja 2013, 10:04

Jest dokładnie tak jak pisze Corvis. Wrzucanie plików do bazy danych jest raczej pozbawione sensu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4730
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 444
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Dane typu BLOB

Nowy postprzez sebaskow » środa, 29 maja 2013, 22:50

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ę.
Avatar użytkownika
sebaskow
Intelektryk
Intelektryk
 
Posty: 135
Dołączył(a): wtorek, 3 maja 2011, 08:30
Lokalizacja: Katowice
Podziękował : 10
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++ Builder XE7
Gadu Gadu: 0
    Windows VistaChrome

Re: Dane typu BLOB

Nowy postprzez Corvis » czwartek, 30 maja 2013, 10:24

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 ;)
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome

Re: Dane typu BLOB

Nowy postprzez Cyfrowy Baron » czwartek, 30 maja 2013, 13:14

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...
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4730
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 444
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Dane typu BLOB

Nowy postprzez sebaskow » czwartek, 30 maja 2013, 13:23

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ę.
Avatar użytkownika
sebaskow
Intelektryk
Intelektryk
 
Posty: 135
Dołączył(a): wtorek, 3 maja 2011, 08:30
Lokalizacja: Katowice
Podziękował : 10
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++ Builder XE7
Gadu Gadu: 0
    Windows 7Firefox

Re: Dane typu BLOB

Nowy postprzez Cyfrowy Baron » czwartek, 30 maja 2013, 18:06

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.


Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4730
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 444
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Bazy danych

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość

cron