Форум по программированию Delphi Sources

 



Вернуться   Форум по программированию Delphi Sources > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.03.2011, 19:20
jekahm jekahm вне форума
Новичок
 
Регистрация: 01.06.2009
Сообщения: 54
Репутация: 27
По умолчанию Тип Image в MS SQL

Доброго времени суток!
Дали задание автоматизировать библиотеку института. При выполнении задания столкнулся с проблемой. Я создал в MS SQL 2008 таблицу посетителей библиотеки, одному из полей таблицы присвоил тип Image (для хранения фотографии).
Подскажите, как теперь туда закидывать изображения? И как (уже при использовании программы), выбирая одну из строк в Grid'e, у меня (например, используя компонент Image) выводилась фотография читателя?
Заранее благодрен!
Ответить с цитированием
  #2  
Старый 05.03.2011, 19:59
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,544
Версия Delphi: 7, XE3, 10.2
Репутация: 49088
По умолчанию

я использовал тип BLOB для хранения картинок.
Загрузка выполняется путем вызова методов LoadFromFile/LoadFromStream у поля.
В TImage потом загружается "руками" опять же через SaveToStream.

Почему использовал BLOB - что бы хранить в БД картинки в виде JPEG, т.к. если пользоваться стандартным компонентом TImage, то дельфи норовит хранить их как Bitmap.
Ответить с цитированием
  #3  
Старый 05.03.2011, 20:29
jekahm jekahm вне форума
Новичок
 
Регистрация: 01.06.2009
Сообщения: 54
Репутация: 27
По умолчанию

Цитата:
Сообщение от lmikle
я использовал тип BLOB для хранения картинок.
Загрузка выполняется путем вызова методов LoadFromFile/LoadFromStream у поля.
В TImage потом загружается "руками" опять же через SaveToStream.

Почему использовал BLOB - что бы хранить в БД картинки в виде JPEG, т.к. если пользоваться стандартным компонентом TImage, то дельфи норовит хранить их как Bitmap.

lmikle, если Вас не затруднит, не могли бы Вы написать код, как это надо реализовать...так как с потоками не работал! Буду очень признателен!
Ответить с цитированием
  #4  
Старый 06.03.2011, 11:54
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,714
Репутация: 52347
По умолчанию

Ну вот так я писал как-то в блоб на MSSQL:
Код:
 TBlobField(AdoQuery1.FieldByName('Photo')).LoadFromFile(OpenDialog1.Files.Strings[i]);
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #5  
Старый 06.03.2011, 11:56
Kapitoshka438 Kapitoshka438 вне форума
Начинающий
 
Регистрация: 09.11.2009
Сообщения: 145
Репутация: 238
По умолчанию

Код:
var
  Stream: TFileStream;
begin
  Stream := TFileStream.Create('Temp.jpg', fmCreate);
  TBlobField(Table.FieldByName('Photo')).SaveToStream(Stream);
  Stream.Free;
  Image1.Picture.LoadFromFile('Temp.jpg');
  DeleteFile('Temp.jpg');
end;
Ответить с цитированием
  #6  
Старый 06.03.2011, 12:31
jekahm jekahm вне форума
Новичок
 
Регистрация: 01.06.2009
Сообщения: 54
Репутация: 27
По умолчанию

А класс TBlobField в коде необходимо определять (TBlobField = class(TField))?
Ответить с цитированием
  #7  
Старый 06.03.2011, 12:50
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,714
Репутация: 52347
По умолчанию

Нет, это уже предопределенный класс со своими методами в DB.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #8  
Старый 06.03.2011, 14:49
jekahm jekahm вне форума
Новичок
 
Регистрация: 01.06.2009
Сообщения: 54
Репутация: 27
По умолчанию

Ни один из предложенных методов решения этой проблемы не помогает!
Если я использую то, что предложил Страдалецъ, то вылетает ошибка "List index out of bounds..."
Если использую то, что предложил Kapitoshka438, то ошибка не вылетает, но в то же время записи изображения в таблицу не происходит!
Даже не знаю, что и делать...
Ответить с цитированием
  #9  
Старый 06.03.2011, 14:51
Assistant Assistant вне форума
Продвинутый
 
Регистрация: 20.02.2011
Адрес: там где правят идиоты
Сообщения: 603
Версия Delphi: 7
Репутация: выкл
По умолчанию

дык ты измени то что предложил Страдалецъ, например вот так:
Код:
TBlobField(AdoQuery1.FieldByName('Photo')).LoadFromFile(OpenDialog1.FileName);
если нужно один файл записать
P.S. в его способе записывается несколько выбранных файлов в цикле i

Последний раз редактировалось Assistant, 06.03.2011 в 14:54.
Ответить с цитированием
  #10  
Старый 06.03.2011, 15:37
jekahm jekahm вне форума
Новичок
 
Регистрация: 01.06.2009
Сообщения: 54
Репутация: 27
По умолчанию

Цитата:
Сообщение от Assistant
дык ты измени то что предложил Страдалецъ, например вот так:
Код:
TBlobField(AdoQuery1.FieldByName('Photo')).LoadFromFile(OpenDialog1.FileName);
если нужно один файл записать
P.S. в его способе записывается несколько выбранных файлов в цикле i
Всё равно выдаётся ошибка "Синтаксическая ошибка в имени файла..."

Кстати, попробовал немного иначе сделать:
Код:
var MS : TFileStream;
i: Integer;
begin
MS := TFileStream.Create('D:\1\1.bmp',fmOpenReadWrite);
with ADOQuery1 do try
SQL.Text := 'Insert Into temptable (photo) Values (:pmphoto)';
Parameters.ParamByName('pmphoto').LoadFromStream(MS, ftBlob);
ExecSQL;
finally
MS.Free;
end;
end;

Проверяю в MS SQL - файл записывается...но почему-то Grid в программе очищается.
Ответить с цитированием
  #11  
Старый 06.03.2011, 15:40
Assistant Assistant вне форума
Продвинутый
 
Регистрация: 20.02.2011
Адрес: там где правят идиоты
Сообщения: 603
Версия Delphi: 7
Репутация: выкл
По умолчанию

а грид привязан к ADOQuery1?
Ответить с цитированием
  #12  
Старый 06.03.2011, 15:56
jekahm jekahm вне форума
Новичок
 
Регистрация: 01.06.2009
Сообщения: 54
Репутация: 27
По умолчанию

Цитата:
Сообщение от Assistant
а грид привязан к ADOQuery1?
Конечно, Grid к DataSourse...DataSourse к AdoQuery...
Я добавляю изображение в таблицу при нажатии кнопки...так что изначально все данные в Grid'e есть..но после нажатия исчезают!
Ответить с цитированием
  #13  
Старый 06.03.2011, 16:00
Assistant Assistant вне форума
Продвинутый
 
Регистрация: 20.02.2011
Адрес: там где правят идиоты
Сообщения: 603
Версия Delphi: 7
Репутация: выкл
По умолчанию

Код:
with ADOQuery1 do try
SQL.Text := 'Insert Into temptable (photo) Values (:pmphoto)';
так ты же сам очищаешь главный запрос в AdoQuery1, поэтому Grid и становится пустым, делай INSERT например в AdoQuery2, а потом обновляй AdoQuery1 (через Refresh или Close->Open)

Последний раз редактировалось Assistant, 06.03.2011 в 16:03.
Ответить с цитированием
  #14  
Старый 06.03.2011, 16:50
Kapitoshka438 Kapitoshka438 вне форума
Начинающий
 
Регистрация: 09.11.2009
Сообщения: 145
Репутация: 238
По умолчанию

Цитата:
Если использую то, что предложил Kapitoshka438, то ошибка не вылетает, но в то же время записи изображения в таблицу не происходит!
Это был ответ на второй вопрос. Его надо вставить в обработчик события DoAfterScroll твоего датасета.

Вот ответ на первый вопрос:

Код:
var
  Stream: TMemoryStream;
begin
  Stream := TMemoryStream.Create;
  Image1.Picture.Graphic.SaveToStream(Stream);
  TBlobField(Table.FieldByName('Photo')).LoadFromStream(Stream);
  Stream.Free;
end;

Последний раз редактировалось Kapitoshka438, 06.03.2011 в 16:52.
Ответить с цитированием
  #15  
Старый 07.03.2011, 00:07
jekahm jekahm вне форума
Новичок
 
Регистрация: 01.06.2009
Сообщения: 54
Репутация: 27
По умолчанию

Цитата:
Сообщение от Kapitoshka438
Это был ответ на второй вопрос. Его надо вставить в обработчик события DoAfterScroll твоего датасета.

Вот ответ на первый вопрос:

Код:
var
  Stream: TMemoryStream;
begin
  Stream := TMemoryStream.Create;
  Image1.Picture.Graphic.SaveToStream(Stream);
  TBlobField(Table.FieldByName('Photo')).LoadFromStream(Stream);
  Stream.Free;
end;
Спасибо, Kapitoshka438! Изображение добаляется, но не при первом нажатии кнопки (которая добавляет изображение в таблицу).

При работе с событием AfterScroll почему-то вообще ничего не происходит!

Также попытался вывести изображение (но уже в другой Image) с помощью
Код:
Image2.Picture.Graphic.LoadFromStream(Stream);
из потока, который использовал при добавлении изображения, но все равно ничего не происходит!
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:00.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2020

ВКонтакте   Facebook   Twitter