PDA

Просмотр полной версии : MS SQL. Builder6. Вставка картинки в базу


TRiPLE
25.04.2005, 21:06
Дурацкий вопрос, но никак не могу допереть. Есть картинка. Я её умею перетаскивать в объект типа TField, но как потом это поле передать в базу используя ADOQuery? Я попробовал сначала получить нужную строку из базы, потом запихал в ADOQuery->Fields->FieldByName("Photo") картинку загрузкой из потока. А что дальше? Вызывал метод Post(), но потом глюки при попытке просмотра лезут. Чё делать? Можно ли как-то передать данные с того же потока в параметр sql запроса? В смысле в конструкцию UPDATE Base SET Photo=параметр WHERE ID=n запихать параметром данные с картинкой. Впервые столкнулся с проблемой и туплю нещадно.

ЕЖ
25.04.2005, 21:25
Можно слить битмап в стрим, и потом передать его в самописную функцию, переводящую бинарный поток в hex-строку вида 0xA2CE3F... (это пример ;) ).
И далее пихать эту строку в запрос:UPDATE Base SET Photo=0xA2CE3F... WHERE ID=n

/7y3uK
26.04.2005, 09:51
общий алгоритм:
если картинка из файла - открываем файл бинарным (блоб) потоком и запихиваем через какую-либо буферную переменную в блоб филд в бд...
если картинка на канве то все не так просто, тут все зависит от того что за картинка (формат) у тя, т.к. помимо сканлайнсов тебе еще нужно сторить карту цветов, т.к. это битмапа в конечно счете.... думаю проще встроеными средствами сохранить во временный файлик и залить его как в первом случае....

а глюки могут быть - это надо дебажить... проверь как у тебя определен филд...

TRiPLE
26.04.2005, 10:34
/7y3uK:
если картинка из файла - открываем файл бинарным (блоб) потоком и запихиваем через какую-либо буферную переменную в блоб филд в бд...
Это понятно. Я сделал уже из картинки отдельный объект типа блобфилд. И что дальше? Меня то интересует вопрос того как проще передать этот филд уже в базу. Может OLE DB заюзать как-то? Я, правда, ОЛЕ и юзал то всего один раз и то для общения с Excel...

/7y3uK
26.04.2005, 11:02
да нет вроде... там все как обычно должно быть... я когда то давно делал вне нормально и без гемороев... единственное что траблы могут появиться с окончанием потока, т.е. если у тебя размерность разная буфера и файла самого... т.е. на пример буфер у тебя жестко 256 байт а файл у тя к примеру 514, то это надо ручками отслеживать... буфер динамический должен быть по идее... отсюда и картинка сбивается и прочие глюки
ты по пробуй по дебажить на каком нить маленьком файлике то что у тебя считывается и то что в итоге подсовывается в запрос...

TRiPLE
26.04.2005, 12:20
Фуф, вроде сделал. На самом деле, задача была перенести фотки из бде-шной базы на сервер. Но на данный момент их нужно было просто пару запихать туда для демонстрации другой проги. Я и геммороился с запихиванием картинок из всяких левых источников, как то файл или клипборд. В итоге сделал утилиту, которая из старой базы в новую переносит данные, там все получилось быстро из без проблем с потоками и т.п. Сделал выборку в обеих базах, если в новой нет записи, то всем полям выбранной записи присваиваюстя поля записи из старой базы и делается Post(). Может и не очень хорошо пост юзать, но перенести надо всего сотни три записей.
Кстати, ещё вопрос, может кто знает. У меня в проге создается в рантайме объект TADOQueryб присваивается ссылка на него datasource-у, а на тот зацеплен TDBImage. В рантайме же свойству DataField присваивается значение "Photo", т.е. имя поля с фотографией... Но при выборе записи вылетает ошибка: "Field 'Photo' not found'". Запрос делается типа "SELECT * FROM Base" и т.д. Поле это там точно есть. И не пустое даже.

Вот торможу то. Я после одно запроса делал через тот же объек запрос к другой базе с другим набором полей, а картинка то все равно пыталась читаться из него... Всем спасибо. Вопрос снят.

Dolphin_spb
26.04.2005, 13:30
Дурацкий вопрос, но никак не могу допереть. Есть картинка. Я её умею перетаскивать в объект типа TField, но как потом это поле передать в базу используя ADOQuery? Я попробовал сначала получить нужную строку из базы, потом запихал в ADOQuery->Fields->FieldByName("Photo") картинку загрузкой из потока. А что дальше? Вызывал метод Post(), но потом глюки при попытке просмотра лезут. Чё делать? .
Синтаксис Delphi
TBlobField(FieldByName('Photo')).LoadFromStream();
Но это если не с SQL Serverом работаешь, ну типа для BDE