?x取 Access ?Y料?斓??D形?谖? ?x取 Access ?Y料?斓??D形?谖?:CSDN论坛,CSDN开发高手,CSDN技术社区

?x取 Access ?Y料?斓??D形?谖?
   浏览选项:     

?x取 Access ?Y料?斓??D形?谖?

(使用 Delphi 5 + ADOExpress)

?Y料提供、整理:????生,蔡??麟,朱子

摘要

「如何?x取?K?@示 Access ?Y料?斓??D形?谖毁Y料?」已是?? FAQ,本文主旨即在?f明解?Q此???}的方法。此方法最初是在 efg's Computer Lab ?W站的一篇文章中得?恚?但目前??文已??在?W站上消失了。如果你搜?? Borland 新??群?M,也可以找到??似的解答,整理?@篇文章只是方便大家?⒖肌?

??先?_定你的???X有安?b Microsoft© Access 中文版,在本文中我???⑹褂闷潆S附的北?L?Y料???碜鍪竟?。

???}重?F

  1. 建立一??新的?0福?然後在 Form1 上面各放置一?? ADODataSet,DataSource,DBImage,DBGrid。
  2. ?O定 ADODataSet1 的 ConnectionString ?傩裕?

    Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:Program FilesMicrosoft OfficeOfficeSamplesNorthwind.mdb;Persist Security Info=False

    以及 CommandText ?傩裕?

    select * from ?a品???e

     

  3. 把?B接各元件的?傩栽O定好之後,?? ADODataSet1 的 Active ?傩栽O?? True,此?r便??出?F?e?`??息 "Bitmap image is not valid."。由於???D形是以 OLE 物件的形式存在?Y料?熘校?而 DBImage ?K未支援?@?N格式的?D形?Y料,因而?l生?e?`。你可以在程式中加入下面?@行程式?a,它?????D形?Y料存到 Blob.dat ?n案?e面:

    TBlobField(ADODataSet1.FieldByName('?D片')).SaveToFile('Blob.dat');

    如果用 UltraEdit 之??的工具?z?????n案的?热荩?可以看到它大概是?L成?@?樱?

    1 151C2F00020000000D000E0014002100 ../...........!.2 FFFFFFFF4269746D617020496D616765 ....Bitmap Image3 005061696E742E506963747572650001 .Paint.Picture..4 05000002000000070000005042727573 ...........PBrus5 6800000000000000000020540000424D h......... T..BM6 16540000000000007600000028000000 .T......v...(... 7 C0000000DF0000000100040000000000 ................8 A0530000CE0E0000D80E000000000000 .S..............9 00000000000000000000800000800000 ................10 00808000800000008000800080800000 ................11 C0C0C000808080000000FF0000FF0000 ................12 00FFFF00FF000000FF00FF00FFFF0000 ................13 FFFFFF00FF0CB0C9000B090900000A00 ................14 9009000000000909A09A900B09000A90 ................15 A00000000FFFEFFFFFFFFFFFFFFFFFCB ................16 9CFCFEFAFFFFFFFFEDFFFEDEFFDEFEFC ................17 FFFFDADA00D900009009009000000000 ................18 090A00090BC0000900900000000A00AC ................19 A0E0E0E0F0E9CA9000A9CB0C00009090 ................20 E0000009090B0000D009009000000900 ................21 009A000FFFFFFFFFFFFEFFFFFFFFFCAD ................22 EBDBDFDFDFFFFFFFFFEFEDFFFEFFFFFF ................23 FEFCAF0C9A0A0D00009A000000000000 ................24 0009090A000B009A9000090000900C09 ................25 00900900FA90ADA00090B00B00000000 ...................

解?Q方法

前面?f?^,DBImage 之所以?o法正常?@示?D形,是因?楫?初???谖坏??D形?Y料是以 OLE 物件的格式存?M去的(跟是不是 Access ?Y料???]?P?S),所以解?Q方法就是?? OLE 格式的?D形?Y料?D?Q成 DBImage 支援的 bitmap 格式,?⒖家韵虏襟E:

  1. ?h除 DBImage1,?K且?⒁韵鲁淌酱a?N到你的程式?e:

    procedure LoadImageFromField(APicture: TPicture; AField: TBlobField);var  ABitmap: TBitmap;  AStream: TMemoryStream;begin  if AField.IsNull then    Exit;  AStream := TMemoryStream.Create;  try    AField.SaveToStream(AStream);    // Skip OLE storage header    AStream.Seek(78, soFromBeginning);    ABitmap := TBitmap.Create;    try      ABitmap.LoadFromStream(AStream);      APicture.Graphic := ABitmap;    finally      ABitmap.Free;    end;  finally    AStream.Free;  end;end;

     

  2. 在 ADODataSet1 的 AfterScroll 事件中呼叫 LoadImageFromField 函式:

    procedure TForm1.ADOTable1AfterScroll(DataSet: TDataSet);begin  LoadImageFromField(    Image1.Picture,    DataSet.FieldByName('?D片') as TBlobField  );end;
  3. ???g?K?绦谐淌剑??F在你????可以看到?D形?谖徽??_地?@示在 Image1 ?e面了。

 

下?d??例程式:AdoAccessImg.zip

 

?a充?Y料

[?T工]?Y料表的[相片]?谖唬ㄖ熳? 提供)

有位?W友(bcc10212001)於「?c空?g」留言板??著以下的???}:

??教一?????}.... 

在delphi?卧??e<?x取 Access ?Y料?斓??D形?谖唬ㄊ褂? Delphi5+ADOExpress)> 我照著做可以可以看到?D形?谖徽??_地?@示在 Image1 ?e面。是如果Table改成"?T工"?s不行,一?映霈FBitmap is not valid的???},?@是怎?N回事.....。

今我?⑽业幕馗舱?理在此,?c各位分享:

如果你用的是 Access 2002 的版本,?T工相片?谖坏馁Y料格式已????更?椤肝淖帧垢袷剑?所以自然就不能使用?@??方法。 

然而你用的是 Access 2000 或之前的版本,首先我必??指出的是微??建立?T工的各?P?Y料,是早在 Access 97 或更早的 Access 2.0 就建立好了,而?@些?Y料都未???D?Q或改??。因此,?m然同?邮? OLE 物件的?Y料格式,然而?Υ娴男问??s有差微的不同。??我??”?a品???e”的”?D片”?谖毁Y料,?c”?T工”的”相片”?谖毁Y料?D成?n案?Υ驷幔?拿?硪黄鸨容^?r,可以?l?F?@些微的不同,我?①Y料列示如下: 

”?a品???e”的”?D片”?谖毁Y料 --------------------------------------------------------------------1: 15 1C 2F 00 02 00 00 00 0D 00 0E 00 14 00 21 00; ../...........!. 2: FF FF FF FF 42 69 74 6D 61 70 20 49 6D 61 67 65; ....Bitmap Image 3: 00 50 61 69 6E 74 2E 50 69 63 74 75 72 65 00 01; .Paint.Picture.. 4: 05 00 00 02 00 00 00 07 00 00 00 50 42 72 75 73; ...........PBrus 5: 68 00 00 00 00 00 00 00 00 00 20 54 00 00 42 4D; h......... T..BM 6: 16 54 00 00 00 00 00 00 76 00 00 00 28 00 00 00; .T......v...(... 7: C0 00 00 00 DF 00 00 00 01 00 04 00 00 00 00 00; ................ --------------------------------------------------------------------
”?T工”的”相片”?谖毁Y料 --------------------------------------------------------------------1: 15 1C 2D 00 02 00 00 00 0B 00 0E 00 14 00 1F 00 ;..-............. 2: FF FF FF FF C2 49 B0 7D B9 CF BC 76 B9 B3 00 50 ;     ?c???D影像.P 3: 61 69 6E 74 2E 50 69 63 74 75 72 65 00 01 05 00 ;aint.Picture.... 4: 00 02 00 00 00 07 00 00 00 50 42 72 75 73 68 00 ;.........PBrush. 5: 00 00 00 00 00 00 00 00 C0 53 00 00 42 4D B6 53 ; ........ ..BM ?t?H 6: 00 00 00 00 00 00 76 00 00 00 28 00 00 00 C0 00 ;......v...(...? 7: 00 00 DE 00 00 00 01 00 04 00 00 00 00 00 40 53 ;..?..........@S --------------------------------------------------------------------

??注意 [42 4D B6 53] (第五行)?@些?Y料,在”?a品???e”的”?D片”?谖毁Y料中,?念^起算至 79 ??位址,而在”?T工”的”相片”?谖毁Y料中?s出?F於第 77 ??位址。因此?碾p方的?Y料比?^可以明?@看出,相差????字元,而?@就是存取?T工相片?Y料?r,?l生『Bitmap is not valid』?e?`??息的?P?I。 

因此在存取”?T工”的”相片”?谖??r,之前??的 LoadImageFromField 函式必??稍作修改:

原?椋?

    AStream.Seek(78, soFromBeginning);

改成:

    AStream.Seek(76, soFromBeginning);

~  end ~

Nov-13-2001, Apr-13-2002