Zapis do BLOB

0

Witam.
Używam środowiska C++ Builder i chciałbym zapisać obraz bmp do bazy danych na serwerze MySQL.
Próbowałem uzywając strumieni. Ale nie wiem jak dane ze strumienia dopisać do bazy. Oto mój kod:

      const void *s;

  TMemoryStream *Stream = NULL;
  Stream = new TMemoryStream();
  Stream->Write(s,1);
  Image1->Picture->Bitmap->SaveToStream(Stream);

  Stream->Position = 0;

W strumieniu jest wszystko w porządku, tylko jak teraz taki strumień właśnie zapisać do bazy? Normalne dane, tzn. String, czy Int dodawałem przez polecenie:

  Query1->SQL->Text ="INSERT INTO Towar VALUES (NULL,'"+Edit1->Text+"','"+Edit2->Text+"')";
  Mod->Query2->ExecSQL();

Dodam, że używam komponentów BDE.

Proszę o pomoc w moim problemie, lub o pomysł na inne rozwiązanie tego problemu.
Pozdrawiam.

0

ja robiłem to tak:

  • pole w bazie typu image lub text
    -dodawanie
TBlobField* field = (TBlobField*)DM->tabela->FieldByName("nazwa_pola");
field->SetFieldType(ftBlob);
field->Transliterate = false;
field->LoadFromFile("sciezka");
tabela->Post();

działa na BDS2006 Architect + MsSql2000. jak to będzie wyglądać z MySql nie wiem

0

Właśnie, jeśli chodzi o bazy danych obsługiwane przez TTable, to owszem, to jest dobre rozwiązanie. Natomiast jeśli chodzi o MySQL, to przesyłanie danych z Buildera do bazy następuje poprzez polecenie:

Query1->SQL->Text = " Insert cos tam - Polecenie QSL ";

Jak takie dane wysłać do bazy i jak je następnie odczytać i wyświetlić w TImage?

Pozdrawiam

0

zainteresuj się więc DBExpress i komponentami TSQL....

0
vixen03 napisał(a)

ja robiłem to tak:

  • pole w bazie typu image lub text
    -dodawanie

    TBlobField* field = (TBlobField*)DM->tabela->FieldByName("nazwa_pola");
    field->SetFieldType(ftBlob);
    field->Transliterate = false;
    field->LoadFromFile("sciezka");
    tabela->Post();
</ul>
> 
> działa na BDS2006 Architect + MsSql2000. jak to będzie wyglądać z MySql nie wiem


Dobra jestem zdesperowany. Mam nadzieje, że ktoś mi pomoże.
Ogólnie robie tak jak napisałeś ale nie wiem co to jest DM i tabela .... w bazie ms sql mam tabele
test z polami id int, plik image.

plik image dodaje mniej wiecej tak:

TBlobField plik= (TBlobField)this->ADOTable1->FieldByName("plik"); //(TBlobField*); // FieldByName("nazwa_pola");
AnsiString sciezka="c:\plik.jpg";
this->ADOTable1->Edit();
plik->SetFieldType(ftGraphic);
plik->Transliterate = false;
plik->LoadFromFile(sciezka);
this->ADOTable1->Post();
plik->Free();

wyskakuje mi wtedy bład: AdoQuery1:comandtext does not return a result set.
do bazy dodaje sie jednak rekord z  <Binary Data>

moje pytanie jak to teraz wyswietlić w ogóle jak poprawnie dodac obrazek np typu jpg do bazy. Z gory dziekuje.
pozdrawiam Janusz
0

Funkcja wrzucająca obrazek do bazy MS SQL:

bool insertPicture(TADOTable *tabela, AnsiString File, AnsiString Field, AnsiString TableName)
{ bool result;
 try
 {
  tabela->Active = true;
  tabela->TableName = TableName;
  tabela->Insert();
  TBlobField* field = (TBlobField*)tabela->FieldByName(Field);
  field->SetFieldType(ftBlob);
  field->Transliterate = false;
  field->LoadFromFile(File);
  tabela->Post();
  result = true;
 }
 catch(...)
 {
  result = false;
 }
 return result;
}
0

Dodatkowo funkcja wyciągająca obrazek z bazy MS SQL:

bool GetJpg(TImage *Image, TBlobField *Field)
{ bool result;
 try
 {
  TJPEGImage *jp = new TJPEGImage();
  TADOBlobStream *BS = new TADOBlobStream(Field, bmRead);
  jp->LoadFromStream(BS);
  Image->Picture->Assign(jp);
  BS->Free();
  jp->Free();
  result = true;
 }
 catch(...)
 {
  result = false;
 }
 return result;
}
</cpp>

1 użytkowników online, w tym zalogowanych: 0, gości: 1