小问题拿大分:delphi程序如何写入access表ole对象字段的内容,能在access中被打开? (200分)

  • 主题发起人 主题发起人 szgh
  • 开始时间 开始时间
S

szgh

Unregistered / Unconfirmed
GUEST, unregistred user!
我写的(读取,对象是在access插入的),发现原字段中是BMP对象,而读出的是包对象,请各位解决如何正确读取.
tOle := TOLEContainer.Create(self);
f := TBlobField(adot.FieldByName('ole'));
f.SaveToFile('tmp');
tOle.CreateObjectFromFile('tmp',false);
 
Bit : TBitmap;
begin
Bit := TBitmap.Create;
Bit.Assign(adot.FieldByName('ole'));
......
 
to 木子
搞清问题!!,写入的对象能在access中打开
 
TBlobField(ADOQuery1.fieldbyname('ole')).SaveToFile('filename.bmp');
//写入文件
TBlobField(ADOQuery1.FieldByName('ole')).LoadFromFile('filename.bmp');
//将文件写入OLE字段
 
不好意思,搞错问题了。
 
没人知道吗?
 
下面的代码可以将指定的图片放到Access中,唯一的问题是只能放在表的第一个字段中。思路如下:1、将OleContainer中的图片复制到剪切板上,用servers控件中的
TAccessApplication控件打开一个access实例,打开要放入图片的表,添加新记录,
粘贴图片对象。由于不会选择字段,所以只能对表中第一个字段操作,不算是大问题吧?
希望如此!你参考一下吧:
OleContainer1: TOleContainer;
AccessApplication1: TAccessApplication;

........

self.OleContainer1.CreateObjectFromFile('c:/1.jpg',true);
SELF.OleContainer1.Copy;
self.AccessApplication1.Connect;
self.AccessApplication1.OpenCurrentDatabase('e:/db1.mdb',False);
self.AccessApplication1.CurrentDb.OpenTable('tb4',0);
self.AccessApplication1.DoCmd.OpenTable('tb4', acViewNormal, acAdd);
self.AccessApplication1.DoCmd.GoToRecord(acTable, 'tb4', acNewRec ,acLast);
self.AccessApplication1.SetHiddenAttribute(acTable,'f1',True);
//self.AccessApplication1.DoCmd.SelectObject(acTable,'f1',False);
self.AccessApplication1.DoCmd.RunCommand(acCmdPaste);

解决只能更新第一个字段的办法,将前面的字段隐藏,执行下面的语句一次就隐藏一个
self.AccessApplication1.RunCommand(acCmdHideColumns);//有几个字段在图像字段的前边,将该语句重复几次
 
好复杂,我研究以下,有其他办法吗,难道ole对象字段的存储格式没人知道?
 
你存储对像的时候应该将此对象的后缀名存到一个字段里

你save成临时文件时以那个字段的后缀名建立
ole才能正确识别对象
 
不是扩展名的问题,是access和delphi存储格式不同
 
如果解决了这个问题!希望可以把代码贴出!thank
 
在数据库中插入对象可以打开,插入长二进制就需要程序处理
 
由delphi插入的可以读写,access插入,delphi无法读, delphi写入的无法由access读出
 
除非知道Access的存储格式,否则无法互操作。
 
关注中!!!
顶!!!!
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls,jpeg, Db, ADODB;

type
TForm1 = class(TForm)
Btn_Save: TButton;
Btn_View: TButton;
ADOConnection1: TADOConnection;
ADOTable1: TADOTable;
Panel1: TPanel;
ViewPic: TImage;
Edit_name: TEdit;
OpenDialog1: TOpenDialog;
Btn_open: TButton;
Btn_next: TButton;
Btn_pre: TButton;
procedure Btn_SaveClick(Sender: TObject);
procedure Btn_ViewClick(Sender: TObject);
procedure Btn_openClick(Sender: TObject);
procedure Btn_nextClick(Sender: TObject);
procedure Btn_preClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Btn_SaveClick(Sender: TObject);
var
MyJPEG : TJPEGImage;
MS: TMemoryStream;
begin
MyJPEG := TJPEGImage.Create;
try
with MyJPEG do
begin
Assign(ViewPic.Picture.Graphic);
MS:=TMemoryStream.create;
SaveToStream(MS);
MS.Position:=0;
ADOTable1.Append;
TBlobField(ADOTable1.FieldbyName('file')).LoadFromStream(MS);
ADOTable1.FieldByName('name').AsString:=Edit_Name.Text;
ADOTable1.Post;
Messagebox(Getactivewindow(),'图像保存完毕!','保存',mb_ok);
end;
finally
MyJPEG.Free;
end;
end;


procedure TForm1.Btn_ViewClick(Sender: TObject);
var
tempstream:TStringStream;
tempjpeg:TJPEGImage;
begin
try
tempstream:=TStringStream.Create(' ');
TBlobField(ADOTable1.FieldByName('file')).SaveToStream(tempstream);
tempstream.Position:=0;
tempjpeg:=TJPEGImage.Create;
tempjpeg.LoadFromStream(tempstream);
ViewPic.Picture.Bitmap.Assign(tempjpeg);
Edit_Name.Text:=ADOTable1.FieldByName('name').AsString;
finally
tempstream.Free;
tempjpeg.Free;
end;
end;

procedure TForm1.Btn_openClick(Sender: TObject);
begin
if opendialog1.Execute then
ViewPic.Picture.LoadFromFile(opendialog1.FileName);
end;

procedure TForm1.Btn_nextClick(Sender: TObject);
begin
if not adotable1.Eof then
begin
Btn_ViewClick(nil);
adotable1.Next;
end;
end;

procedure TForm1.Btn_preClick(Sender: TObject);
begin
if not adotable1.Bof then
begin
Btn_ViewClick(nil);
adotable1.MoveBy(-1);
end;
end;

end.
大家改改就可以拉,什么时候结贴?[:D][:D]
 
请注意问题?
由delphi插入的可以读写,access插入,delphi无法读, delphi写入的无法由access读出

 
后退
顶部