Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Не хочу читать хелп, а мануал я выбросил нафиг.


Автор: =Женек= 12.11.2005, 20:10
Сабж - шутка.


На самом деле в инете мало чего есть на эту тему, а в мануале (Поль Дюбуа - MySQL) очень скудно.

Как мне загрузить картинку из Image1->Picture в MySQL ? Что через BLOB поля, это я знаю, мне бы поконкретней.

Поделитесь парой строк кода..

Автор: =Женек= 12.11.2005, 21:24
нашел что-то - но там есть mysql_real_escape_string которая работает сбуфером типа char. А как мне Image1->Picture перегнать в char?

Автор: sadhu 13.11.2005, 13:02
Повнимательнее почитай хэлп по TImage - там есть возможность получить указатель на массив пикселов. Берешь его, копируешь блок памяти в свою переменную (может и без копирования пройдёт, но не гарантирую) и скармливаешь это "эскейп_рил".

Автор: =Женек= 13.11.2005, 22:53
Я нашел там интересную штуку - SaveToStream

Как мне прочесть из TStream и обработать в mysql_real_escape_string.
И еще момент - я так понимаю что в BLOB можно записать что угодно.
Так вот надо записать так, чтобы я мог с помощью РНР извлечь нормальную картинку.

Автор: _hunter 14.11.2005, 11:52
не знаю через что ты работаеш с базой, но что у TADOQuery что у TIBQuery есть метод CreateBlobStream который создаст поток, в который можно писать SaveToStream-ом

Автор: =Женек= 14.11.2005, 13:19
Нашел я вот такую штуку
Код

TStream * Stream=new TMemoryStream();
picture->Graphic->SaveToStream(Stream);
try
{
query->Close();
query->SQL->Clear();
query->SQL->Add("insert into "+tableName+" ("+keyFieldName+","+pictureFieldName+")"+AnsiString(" values(:param1,:param2)"));
query->ParamByName("param1")->Value=keyValue;
query->ParamByName("param2")->LoadFromStream( Stream,ftBlob);
try
{
query->ExecSQL();
}
catch(Exception & error)
{
ShowMessage(error.Message);
return ;
}
}
__finally
{
delete Stream;
}



Вместо TIBQuery можно использовать компоненты MySQL DAC.
ОДнако я пишу на С API, не хочется перестраиваться на эти компоненты.

Мне всего-то нужно данные из TStream обработать функцией mysql_real_escape_string.
Блин.. что-то я совсем запутался...



Автор: _hunter 14.11.2005, 13:25
а что она принимает? можно из буффера ( потока ) строку вытащить...

Автор: =Женек= 14.11.2005, 13:28
Я кажется писал - char массив обрабатывается функцией real_escape_string. В массив данные попадают из файла.

Автор: _hunter 14.11.2005, 14:06
ну так тю:
char* buffer = new char[stream->Size];
stream->Read(buffer, stream->Size);

Автор: sergejzr 14.11.2005, 14:19
Модератор: Название темы должно отражать ее суть!

Автор: =Женек= 14.11.2005, 14:27
Я вот так сделал:
Код

TStream * Stream=new TMemoryStream();
TStream * Stream2=new TMemoryStream();
AddFilmForm->Screen1->Picture->Graphic->SaveToStream(Stream);
char* buffer = new char[Stream->Size];

Stream->Write(buffer,Stream->Size);

Stream2->Read(buffer, sizeof(buffer));

AddFilmForm->Screen2->Picture->Graphic->LoadFromStream(Stream2);



Для проверки - картинка из одного TImage копируется в другой. Посредник buffer.

ловлю exception Access violation

Автор: Vyacheslav 15.11.2005, 17:46
То есть хелп читать принципиально не желаем?
Цитата

WriteBuffer(const void *Buffer, int Count);
Writes Count bytes from Buffer onto the stream and advances the current position of the stream by Count bytes.

Читает Count байтов ИЗ буфера в поток
В результате имеем
Код

//выделем буфер (пока с мусором)
char* buffer = new char[Stream->Size];
//дописываем это буфер с мусором уже к имеющей картинке
Stream->Write(buffer,Stream->Size);
//а теперь пытемся из пустого стрима в буфер записать информацию размером в буфер
Stream2->Read(buffer, sizeof(buffer));

Автор: =Женек= 15.11.2005, 20:56
Вячеслав, вы правы.
Я интуитивно воспринимал смысл функции.

Ну согласитесь, что строка Stream2->Read ассоциируется с чтением из буфера и записью в Stream

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)