ADO存图片的几种方法,我都试过了,如下:但都不行,怎么回事,晕,请教高手。(一直在线)

bphantom 2003-08-22 02:56:23
var
Stream : TMemoryStream;
//jpegImage : TJPEGImage;
picstream:tadoblobstream;

Stream :=TMemoryStream.Create;
if FileExists(gInfo.info.carPicSource + '\show.jpg') then
begin
Stream.LoadFromFile(gInfo.info.carPicSource + '\show.jpg');
//jpegImage := TJPEGImage.Create;
//jpegImage.LoadFromFile(gInfo.info.carPicSource + '\show.jpg');
//jpegImage.SaveToStream(stream);
//jpegImage.Free;
stream.Position:=0;
end;

DMRoadWay.ADOTabImage.Close;
DMRoadWay.ADOTabImage.Open;
DMRoadWay.ADOTabImage.Insert;
DMRoadWay.ADOTabImage.Edit;
DMRoadWay.ADOTabImage.FieldByName('IMAGENO').AsString := strGuid;
//picstream:=tadoblobstream.Create(tblobfield(DMRoadWay.ADOTabImage.FieldByName('pic')),bmWrite);
//(TBlobField(DMRoadWay.ADOTabImage.FieldByName('PICTURE'))).LoadfromFile(gInfo.info.carPicSource + '\show.jpg');
//DMRoadWay.ADOTabImageIMAGENO.LoadFromStream(stream);
//(DMRoadWay.ADOTabImage.Fieldbyname('PIC') as TBlobField).LoadFromStream(stream);
TBlobField(DMRoadWay.ADOTabImage.FieldByName('PICTURE')).LoadFromStream(stream);
//(DMRoadWay.ADOTabImage.Fields[1] as TBlobField).LoadFromStream(stream);
DMRoadWay.ADOTabImage.Post;
Stream.Free;


{ DMRoadWay.ADOQueryImage.close;
DMRoadWay.ADOQueryImage.SQL.clear;
DMRoadWay.ADOQueryImage.SQL.add('select * from DB2ADMIN.test');
DMRoadWay.ADOQueryImage.open;
DMRoadWay.ADOQueryImage.edit; }
{ picstream:=tadoblobstream.Create(tblobfield(DMRoadWay.ADOTabImage.Fields[1]),bmWrite);
//picstream:=tadoblobstream.Create(tblobfield(DMRoadWay.ADOQueryImage.FieldByName('pic')),bmWrite);

picstream.LoadFromFile(gInfo.info.carPicSource + '\show.jpg');
picstream.Position:=0;
tblobfield(DMRoadWay.ADOTabImage.Fields[1]).loadfromstream(picstream);
DMRoadWay.ADOQueryImage.Post; }

在这么多排列出来的方法中,如果用FieldByName,则:field 'pic' not found
如果用Fields[1],则:list out of bounds(1).
但DMRoadWay.ADOTabImage.FieldByName('IMAGENO').AsString := strGuid;这句都能正确执行,说明表是连上的。为什么就表中的pic字段找不到呢?
我用的是db2数据库,生成表的sql如下:
CONNECT TO LWCENTER;
CREATE TABLE DB2ADMIN.TEST ( IMAGENO VARCHAR (60) , PIC BLOB (30 K ) NOT LOGGED NOT COMPACT ) ;
CONNECT RESET;
其中就两个字段了。
我搞了进一天了,还是搞不定。望高手们指教!
...全文
30 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ihihonline 2003-08-22
  • 打赏
  • 举报
回复
不用这么烦,你选择其字段类型为OLE ,可以进行直接存取//这仅仅限于.bmp.
如果是其它类型,则将其转化成bmp,delphi给你提供转化的pas单元.
bphantom 2003-08-22
  • 打赏
  • 举报
回复
问题是用下面的方法就行了:
DMRoadWay.ADOTabImage.Close;
DMRoadWay.ADOTabImage.Open;
DMRoadWay.ADOTabImage.Insert;
DMRoadWay.ADOTabImage.Edit;
DMRoadWay.ADOTabImageIMAGENO.AsString := strGuid;
DMRoadWay.ADOTabImagePIC.LoadFromStream(stream);
DMRoadWay.ADOTabImage.Post;
Stream.Free;
而用ieldByName和Fields[1]都不行,奇怪了。
bphantom 2003-08-22
  • 打赏
  • 举报
回复
你们的方法,在我的问题中都有了,现在出的问题该是:
我怀疑是数据库的问题了,我test表中有两个字段,IMAGENO VARCHAR (60) , PIC BLOB (30 K )
我的测试如下:
showmessage(DMRoadWay.ADOTabImage.FieldByName('imageno').FieldName);
showmessage(DMRoadWay.ADOTabImage.FieldByName('pic').FieldName);
//showmessage(DMRoadWay.ADOTabImage.Fields[1].FieldName);
第一个showmessage显示“imageno”,正常;
到了第二个showmessage时,用FieldByName('pic')回出现:Field 'pic' not found;
如用Fields[1],则出现index list out of bound(1).
你们说是不是很怪,肯定是db2在设计blob字段时的错误吗?
怪怪怪怪怪怪怪怪怪怪怪怪怪怪怪怪怪怪怪怪怪怪怪怪怪怪怪怪怪怪怪怪怪怪怪怪怪怪怪
有人知道吗?
sy_315 2003-08-22
  • 打赏
  • 举报
回复
这是一个存excel的例子,你可以改一下存jpeg图片。
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DB, DBTables;

type
TForm1 = class(TForm)
Database1: TDatabase;
Query1: TQuery;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
No : Integer;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
S : TStream;
begin
S := TFileStream.Create('C:\WINDOWS\DESKTOP\设备描述表(中).xls', fmOpenRead);
try
Inc(No);
with Query1 do
begin
SQL.Text := 'INSERT INTO TEST(A, B) VALUES(:A, :B)';
ParamByName('A').AsInteger := No;
ParamByName('B').LoadFromStream(S, ftBlob);
ExecSQL;
end;
finally
S.Free;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
with Query1 do
begin
SQL.Text := 'SELECT A, B FROM TEST';
Open;
TBlobField(FieldByName('B')).SaveToFile('C:\WINDOWS\DESKTOP\设备描述表(中)11.xls');
Close;
end;
end;

end.
bphantom 2003-08-22
  • 打赏
  • 举报
回复
我去ibm区问问。
bphantom 2003-08-22
  • 打赏
  • 举报
回复
sorry,就是因为试了很多方法,改来改去的,所以太乱了,我现在人也很乱,吗的,我觉得是数据库设计blob字段的问题了。
bphantom 2003-08-22
  • 打赏
  • 举报
回复
我怀疑是数据库的问题了,我test表中有两个字段,IMAGENO VARCHAR (60) , PIC BLOB (30 K )
我的测试如下:
showmessage(DMRoadWay.ADOTabImage.FieldByName('imageno').FieldName);
showmessage(DMRoadWay.ADOTabImage.FieldByName('pic').FieldName);
//showmessage(DMRoadWay.ADOTabImage.Fields[1].FieldName);
第一个showmessage显示“imageno”,正常;
到了第二个showmessage时,用FieldByName('pic')回出现:Field 'pic' not found;
如用Fields[1],则出现index list out of bound(1).
你们说是不是很怪,肯定是db2在设计blob字段时的错误吗?
hp0773 2003-08-22
  • 打赏
  • 举报
回复
文本图片的并存和导出
将doc字段设成image类型,sql server2000测试通过(机子装有word)
procedure TForm1.Button1Click(Sender: TObject);
begin
if opendialog1.Execute then
begin
dbset.Append;
try
begin
dbset.FieldByName('name').AsString:=OpenDialog1.GetNamePath;
TBlobField(dbset.FieldByName('doc')).LoadFromFile(OpenDialog1.FileName);
dbset.Post;
showmessage('保存到数据成功!');
end;
except
showmessage('保存到数据出错!');
end;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
WordApp,WordDoc:variant;
begin
screen.Cursor:=crHourGlass;
TBlobField(dbset.fieldbyname('doc')).SaveToFile('c:\tempdoc.doc');
try
WordApp:=CreateOleObject('word.application');
WordApp.caption:='管理系统';
WordApp.visible:=true;
WordDoc:=WordApp.documents.open('c:\tempdoc.doc');
except
WordDoc.close(true);
WordApp.Quit(false);
end;
screen.Cursor:=crDefault;
end;
eaglezhao 2003-08-22
  • 打赏
  • 举报
回复
程序太乱,看不下去了。
  • 打赏
  • 举报
回复
用adoquery 代替 adotable
同时在design time 双击adoquery(必须有sql语句)后添加fields(其中包括 image 的fields)
然后再调用。

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧