Выгрузка с varchar картинки (разбитый на фрагменты)

Djutty
Дата: 02.06.2009 13:14:18
Привет.
Задача вроде бы проста, но есть нюансы которые создают осложнении:
надо выгрузить из БД (MS sql server) фотографии

1.Есть таблица, название ее - reader_photo
2.Колонки с названием - fragment01, fragment02, fragment03, и т.д. до fragment08 (т.е. фотография может храниться, как я понимаю, в 8 ячейках, и может только в одном фрагменте, тогда все остальные -Null)
3.Тип колонки - varchar(250)

procedure TForm1.Button2Click(Sender: TObject);
Var
J: TJPEGImage;
begin

        ADOQuery2.Active:=false;
       ADOQuery2.SQL.Clear;
        ADOQuery2.SQL.Add('SELECT fragment01 FROM reader_photo where ID = 49');
        ADOQuery2.Active:=true;

;

J := TJPEGImage.Create;
J.LoadFromStream(ADOQuery2.CreateBlobStream(ADOQuery2.FieldByName('fragment01'),bmRead));
Image1.Picture.Bitmap.Assign(j);

        end;

выдает ошибку:

Exception class EInvalidCast with message 'Invalid class typecast'.
FlyD
Дата: 02.06.2009 13:26:01
Djutty, а вы знаете что за тип поля varchar?
zirra
Дата: 02.06.2009 13:28:21

On Tue, 02 Jun 2009 14:14:18 +0400, Djutty <nospam@sql.ru> wrote:

> Автор: Djutty
> 2.Колонки с названием - fragment01, fragment02, fragment03, и т.д. до
> fragment08
> (т.е. фотография может храниться, как я понимаю, в 8 ячейках, и может
> только в
> одном фрагменте, тогда все остальные -Null)
> 3.Тип колонки - varchar(250)

Да-а-а-а... До чего только люди не
додумаются!!!

Картинка с другого сайта.

Posted via ActualForum NNTP Server 1.4

OracleLover
Дата: 02.06.2009 13:31:51
Djutty
Привет.
Задача вроде бы проста, но есть нюансы которые создают осложнении:
надо выгрузить из БД (MS sql server) фотографии

1.Есть таблица, название ее - reader_photo
2.Колонки с названием - fragment01, fragment02, fragment03, и т.д. до fragment08 (т.е. фотография может храниться, как я понимаю, в 8 ячейках, и может только в одном фрагменте, тогда все остальные -Null)
3.Тип колонки - varchar(250)

procedure TForm1.Button2Click(Sender: TObject);
Var
J: TJPEGImage;
begin

        ADOQuery2.Active:=false;
       ADOQuery2.SQL.Clear;
        ADOQuery2.SQL.Add('SELECT fragment01 FROM reader_photo where ID = 49');
        ADOQuery2.Active:=true;

;

J := TJPEGImage.Create;
J.LoadFromStream(ADOQuery2.CreateBlobStream(ADOQuery2.FieldByName('fragment01'),bmRead));
Image1.Picture.Bitmap.Assign(j);

        end;

выдает ошибку:

Exception class EInvalidCast with message 'Invalid class typecast'.


Фотографии и картинки хранят в полях бинарного типа(Imagem BLOB даже по-моему назвается)
r77
Дата: 02.06.2009 13:40:11
Djutty,

у меня, правда, не фотографии, а чертежи в базе хранятся, но какая разница...поле типа varbinary(max)...varchar-символьное поле(char)...
FlyD
Дата: 02.06.2009 13:41:50
r77
поле типа varbinary(max)
А если у него MSSQL 2000, то еще больше его запутаешь :) max в 2000-ом нет...
r77
Дата: 02.06.2009 13:45:43
FlyD,

SQL 2000 - как давно это было...действительно, там такого нет, только тип - IMAGE...
Зайцев Фёдор
Дата: 02.06.2009 13:47:54
не понимаю, с какого перепуга автор использовать TStringField в качестве Blob
Кроик Семён
Дата: 02.06.2009 15:22:00
Если у автора база не его, и не он был ее архитектором, то надо исходить из того, что картинки хранятся в VARCHAR.
Нда....


но все-равно, картинку можно вытащить и в этом случае. Примерно так (код не проверял):

procedure WriteTextInStream(AStream: TStream; AText: string);
var
   pText    : PChar;
begin
   pText:=PChar(AText);
   AStream.Write(pText^,Length(AText));
end;

var
   mem : TMemoryStream;
   i    : integer;
   Fld : TField;
   img : TJPEGImage;
begin
   img:=TJPEGImage.Create(nil);
   try
      mem:=TMemoryStream.Create();
      try
         for i:=1 to 8 do
         begin
            Fld:=ADOQuery2.FieldByName('fragment0'+IntToStr(i))
            if not Fld.IsNull then WriteTextInStream(mem,Fld.AsString);
         end;
         
         mem.Position:=0;
         img.LoadFromStream(mem);

      finally
         mem.Free();
      end;

      Image1.Picture.Bitmap.Assign(img);
   finally
      img.Free();
   end;
end;
zirra
Дата: 02.06.2009 15:24:12

On Tue, 02 Jun 2009 16:22:00 +0400, Кроик Семён <nospam@sql.ru> wrote:

> Автор: Кроик Семён
> Если у автора база не его, и не он был ее архитектором, то надо исходить

Вообще-то, хотелось бы всё-таки услышать начальника транспортного
цеха
ТС...
Картинка с другого сайта.

Posted via ActualForum NNTP Server 1.4