/ / Delphi - Zapisywanie TStringStream do SQL - mysql, delphi, delphi-xe2, stringstream

Delphi - Zapisywanie TStringStream do SQL - mysql, delphi, delphi-xe2, stringstream

Używam Embarcadero Delphi XE2

Tworzę szybki raport (nie jest to takie ważne) i zapisuję go w TStringStream

Dalej tylko dla testów wyprowadzam TStringStream do pliku, a PDF zapisuje dobrze i otwiera się dobrze. Waży około 40 KB (mniej)

Następnie muszę napisać ten plik PDF(TStringStream) do bazy danych SQL poprzez INSERT, jedyne co robię, aby to zmienić, to zastępuję wszystkie cytaty „z” „ponieważ jest wewnątrz”, w przeciwnym razie SQL nie działa.

Dziwną rzeczą jest, gdy ładuję plik zbaza danych, a nawet SELECT długość (załącznik), gdzie załącznik to dane PDF zapisane wcześniej. Kiedy to robię, rozmiar jest większy niż 50 KB (w przypadku niektórych plików PDF nawet około 70 KB), a plik PDF jest całkowicie pusty.

Muszę do tego użyć prostej jednostki mysqlprojekt, który nie zezwala na niektóre setParams lub zapisywanie go za pomocą obiektu Blob, który został przeszukany. Dlatego potrzebuję odpowiedzi dotyczącej tej prostej metody. Wstaw TStringStream do bazy SQL.

Pole bazy danych to MEDIUMBLOB

Z góry dziękuję!

Jacek

Odpowiedzi:

3 dla odpowiedzi № 1

Zdefiniuj pole blob w bazie danych, a następnie możesz użyć komponentu DataSet CreateBlobStream() metoda, aby uzyskać TStream obiekt, którego można użyć do odczytu i zapisu pola blob, jeśli jest to potrzebne.

Możesz nawet wyeliminować TMemoryStream całkowicie, w zależności od tego, w jaki sposób jest używany w pozostałej części kodu. Na przykład, jeśli tylko zapisujesz plik PDF do temp TMemoryStream wyłącznie w celu przechowywania go w bazie danych, możesz pozbyć się TMemoryStream i mieć FastReport zapisać plik PDF bezpośrednio w polu blob za pośrednictwem TStream który CreateBlobStream() zwraca.


2 dla odpowiedzi nr 2

Zależy to od używanego typu danych. Jak stwierdził tvdien, spójrz na pola blob do przechowywania, jeśli jeszcze tego nie zrobiłeś. Z polem blob, ładowanie do bazy danych i zapisywanie z powrotem do strumienia pamięci jest łatwe. Aby załadować do bazy danych, możesz to zrobić:

TBlobField(MyQuery.FieldByName("MyName")).LoadFromStream(MyMemoryStream)

i kopiowanie z bazy danych z powrotem do strumienia pamięci używa SaveToStream w klasie TBlobField.


0 dla odpowiedzi № 3

Problem został rozwiązany przez:

  1. Eksportuj przez frxPDFExport,

  2. przesłonić jego strumień na TMemoryStream,

  3. Konwersja TMemoryStream na Hex String

  4. i WSTAWIANIE go do sql jako „0x” + przekonwertowany_szablon

I tak dziękuję za pomoc mam nadzieję, że ta odpowiedź pomoże w podobnym problemie

Ważny: musiał to być TMemoryStream z powodu dziwnych znaków ASCII w PDF, więc kiedy wyeksportowałem go do TStringStream, a następnie przekonwertowałem na hex, wyszło uszkodzone.

Możesz sprawdzić w sieci funkcję konwersji tablicy bajtów (TMemoryStream) na szesnastkowy ciąg.

Jacek.