求助:1stclass4000vcl7 中的dbimage 与ado有没有冲突 ( 积分: 100 )

  • 主题发起人 主题发起人 kcjevin
  • 开始时间 开始时间
K

kcjevin

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大侠,我用的是1stclass4000vcl7 中的dbimage控件。我想在利用sql server存放jpg图片,直接绑定的方式。我看了他的demo非常好用,可是移植过来是就出现了问题,
demo 用的是bde,我一换成ado的方式,都没问题,增删改都可以,就显示不出图片来。我怀疑是1stclass4000vcl7 中的dbimage控件连接ado的问题。请各位大哥在帮帮好吧
 
不知道你用的是BDE还是ADO,用Tblobstream就要区分这个,否则可以使用 CreateBlobStream就好了
 
大哥,我用的是ado啊
怎么办啊
 
blobstream :=Tblobstream.create(DataSet.fieldbyname(DataField) as TBlobField,bmwrite); 这句改成试试
blobstream :=TCustomADODataSet(DataSet).createBlobStream(DataSet.fieldbyname(DataField),bmwrite);
 
急啊!!!
帮帮忙把
 
不是吧帅哥,dbimage不能存放jpeg都不知道,唉,可怜的孩子,撞了满头包 ^_^
可以用image吗,也不麻烦的
 
解决数据库中图片的问题,关键技术如下:

在数据库上使用Image二进制字段保存,使用Stream流的方式。
创建文件流:
Word_FileStream:=TFileStream.Create(Target_Name,fmOpenWrite or fmCreate);
Word_FileStream.Position:=0;

保存到数据库的Image字段:
TBlobField(AdoQuery1.FieldByName(Column_Name)).SaveToStream(Word_FileStream);

从数据库读取文件到本地硬盘:
TBlobField(ADOQuery1.FieldByName(Column_Name)).loadfromStream(Word_FileStream);

释放文件流:
Word_FileStream.Free;

Server中该字段的数据类型是Image,在Access中该字段的数据类型是OLE对象。...

既然你已经用TDBImage控件使用Picture.LoadFromFile装入了图片,
只要该图片字段和TDBimage控件相连了,直接用adodataset.post,就保存到了
数据库。
如果没有相连,可以直接用
Tblobfield(adodataset.fields[字段名]).loadfromfile
从文件中读,或
Tblobfield(adodataset.fields[字段名]).loadfromstream
从stream中读,
要读出该字段内容,用相应的savetofile,savetostream就行了

注意如果是jpeg图片,要引用 jpeg单元,即: uses jpeg;

综合以上,既能识别bmp又识别读jpeg,我把代码修改如下:
(建议用image,不要用dbimage控件,因为该控件只能识别bmp格式图片)
(程序已调试,运行正确 delphi7 + sql server 2000)
我的数据库是这样的:
id varchar(50)
name varchar(50)
pic image(16)

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Grids, DBGrids, DB, ADODB, StdCtrls, DBCtrls;

type
TForm1 = class(TForm)
DataSource1: TDataSource;
ADOQuery1: TADOQuery;
DBGrid1: TDBGrid;
OpenDialog1: TOpenDialog;
Button1: TButton;
Button2: TButton;
DBImage1: TDBImage;
Image1: TImage;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses DateUtils,jpeg;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
with ADOQuery1 do
begin
close;
SQL.Text:= 'select * from Tpic';
ADOQuery1.Open;
end;

//DBImage1.DataSource:= DataSource1;
//DBImage1.DataField:= 'pic';
end;

//显示
procedure TForm1.Button1Click(Sender: TObject);
var
aBitmap: TBitmap;
aJPEGImage: TJPEGImage;
aStream: TStream;
head: word;
const
bmp = $4D42;
jpeg = $D8FF;
begin
aBitmap:= TBitmap.Create;
aJPEGImage:= TJPEGImage.Create;
aStream:= TMemoryStream.Create;
try
TBlobField(ADOQuery1.FieldByName('pic')).SaveToStream(aStream);

aStream.Position := 0; //一定要有这句
aStream.Read(head,2);
aStream.Position:= 0;
if head = bmp then
begin
aBitmap.LoadFromStream(aStream);
Image1.Picture.Assign(aBitmap);
end
else if head = jpeg then
begin
aJPEGImage.LoadFromStream(aStream);
Image1.Picture.Assign(aJPEGImage);
end;

finally
aBitmap.Free;
aJPEGImage.Free;
aStream.Free;
end;
end;

//添加
procedure TForm1.Button2Click(Sender: TObject);
var
aBitmap: TBitmap;
aJPEGImage: TJPEGImage;
aStream: TStream;
begin
aBitmap:= TBitmap.Create;
aJPEGImage:= TJPEGImage.Create;
aStream:= TMemoryStream.Create;

try
if OpenDialog1.Execute then
begin
if ExtractFileExt(OpenDialog1.FileName)= '.bmp'then
begin
aBitmap.LoadFromFile(OpenDialog1.FileName);
aBitmap.SaveToStream(aStream);
end
else if (ExtractFileExt(OpenDialog1.FileName)= '.jpg') or (ExtractFileExt(OpenDialog1.FileName)= '.jpeg') then
begin
aJPEGImage.LoadFromFile(OpenDialog1.FileName);;
aJPEGImage.SaveToStream(aStream);
end;

with ADOQuery1 do
begin
Append;
aStream.Position:= 0;
TBlobField(FieldByName('pic')).LoadFromStream(aStream);//出错的地方:原来是因为我用了dbimage控件,该控件只能显示bmp格式图片
Post;
end;
end;
finally
aBitmap.Free;
aJPEGImage.Free;;
aStream.Free;
end;
end;

end.


来自:lisongmagic, 时间:2007-3-10 13:39:53, ID:3679497 | 编辑
图片问题 。
主要有两种思路:
1。图片文件保存到数据库:这种方法是将图片文件以二进制形式保存。这种方法不但可以保存图片还可以保存电影啊优点:保密性强;致命缺点:如果图片很多会造成数据库臃肿。
2。保存图片的绝对路径
这种方法只是保存文件的绝对路径到数据库,在访问时读取路径然后。。
优点:简单,快速 缺点:保密问题比较突出(误操作等)
建议: 如果图片数量不是很大建议内部保存

用DBImage控件只能显示bmp图像,一个图像用bmp格式要用0.5M-几M空间,jpeg格式只有几十至几百kB。如果图片较多,用DBImage控件显示,其程序大小是个问题。
一个程序保密要性强,也要考虑安装问题,保存图片的绝对路径,是否考虑安装的盘符。

强烈建议:用jpeg格式图像,数据库内部保存,image显示。
 
谢谢各位大哥,我重申一遍,我用的是1stclass4000vcl7 中的dbimage控件
这个控件显示jpg等各式都没问题。
demo 用的是BDE,我想用ADO,可是改完了之后,除了图片显示不出来,其他的增删改都没问题。
我怀疑是不是这个控件不支持ado
 
谢谢各位大哥,我重申一遍,我用的是1stclass4000vcl7 中的dbimage控件
这个控件显示jpg等各式都没问题。
demo 用的是BDE,我想用ADO,可是改完了之后,除了图片显示不出来,其他的增删改都没问题。
我怀疑是不是这个控件不支持ado
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部