我已经提出这个问题三次了,但却没有得到好的回复,盼望高手现身!!!!(100分)

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

scjinsui

Unregistered / Unconfirmed
GUEST, unregistred user!
我已经提出这个问题三次了,但却没有得到好的回复,盼望高手现身!!!!
[?]现有一数据库,其一字段类型为varbinary,在其他程序中往这个数据库中录入数据,
该字段存储的是Jpg图像,我现在要读取该字段,并显示在Timage中,请问如何实现?
我的读取程序段如下:
var
i:integer;
str:string;
m: TMemoryStream;
Faceimage :Tjpegimage;
// st:Tstream;
s:array of byte;
begin
with adoquery1 do
begin
if active then close;
sql.text:='select * from register where idcard='''+edit1.text+'''';
open;
if recordcount>0 then
begin
str:=Fieldbyname('image').asstring;
if Length(str)>0 then
begin
setlength(s,Length(str));
for i:=1 to length(str) do
begin
s[i-1]:=byte(str);
end;
m := TMemoryStream.Create;
// TBlobField(Fieldbyname('image')).SaveToStream(m);
// (Fieldbyname('image') as Tblobfield).savetostream(m);
m.write(s,length(str));
m.Position:=0;
if m.Size>0 then
begin
Faceimage := Tjpegimage.Create;
Faceimage.LoadFromStream(m);
image1.Picture.Assign(FaceImage);
end;
end;
end;
但执行时出现错误‘JPEG error #52’,(存在数据库中的格式为jpg)????
如果使用强制转化语句:
TBlobField(Fieldbyname('image')).SaveToStream(m);
则会出现错误提示“Invalid class typecast”?
不知该如何解决????!!!!

 
下面的程序段是我在編寫一個試驗程序時寫的﹒在DELPHI 6.0下通過﹒
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
var
ImageStream:TADOBlobStream;
sFileName:String;
begin
if ADODataSet1.State in [dsInsert,dsEdit] then exit;
try
ImageStream:=TADOBlobStream.Create(ADODataSet1Image,bmRead);
{ADODataSet1Image是一個圖像字段}
sFileName:=ExtractFilePath(Application.ExeName)+'tmpImage.';
sFileName:=sFileName+ADODataSet1Extension.Value;
{生成一個臨時文件名,ADODataSet1Extension是圖像的文件擴展名}
ImageStream.SaveToFile(sFileName);{將圖像保存到一個文件}
finally
ImageStream.Free;
end;
try
Image1.Picture.LoadFromFile(sFileName);{如是位圖則直接顯示}
except
on EInvalidGraphic do{當不是位圖﹐為JPEG文件時發生意外錯誤﹐下列代碼完成JPEG圖像的顯示}
begin
Image1.Picture.Graphic := nil;
TJPEGImage(Image1.Picture.Graphic).Create;
Image1.Picture.LoadFromFile(sFileName);
end;
end;
 
binary字段和blob字段的读写方式是否一致?当数据库对应字段为Image时很容易读写,但
现在该字段的类型时binary,这该如何处理?好像不能强制转换(如TBlobField(FieldbyName('image')).savetostream(m))
转化时出现错误"Invalid class typecast"
 
如用ADO時要用TADOBLOBSTREAM才能讀出數据﹒BLOB是指大型二進制對象﹐我想對讀寫BINARY字段是沒有問題的﹒
我的試驗程序用的數据庫是ACCESS 2000.
 
LiuXu:
我按照你的思路写了如下程序段:
procedure TForm1.Button2Click(Sender: TObject);
Var
Stream:TADOBlobStream;
sFileName:String;
begin
with adoquery1 do
begin
if active then close;
sql.text:='select * from register where idcard='''+edit1.text+'''';
open;
if recordcount>0 then
begin
try
Stream:=TADOBlobStream.Create(FieldByName('image')as TBlobField,bmRead);
sFileName:=ExtractFilePath(Application.ExeName)+'tmpImage.jpg';
Stream.SaveToFile(sFileName);{將圖像保存到一個文件}
finally
Stream.Free;
end;
end;
end;
end;
但程序执行到Stream:=TADOBlobStream.Create(FieldByName('image')as TBlobField,bmRead);
时出现错误“Invalid class typecast”
image字段的类型为VarBinary,不知该如何解决???
 
請建立“image”的永久字段對象﹒
然后用﹕Stream:=TADOBlobStram.Create(image的永久字段對象名,bmRead);這樣應能通過﹒
不但能處理圖像﹐還能處理sound的wave file.
TADOBlobStream.Create()的第一個參數是BLOB字段的永久對象﹐第二參數則指明流的訪問方式﹒
 
TADOBlobStream.Create()的第一個參數是BLOB字段的永久字段對象﹐第二參數則指明流的訪問方式﹒
可以是﹕bmRead,bmReadWrite
 
dbimage不行吗?
 
LiuXu:
我的数据库中'image'是TVarBytesField类型的字段,恕在下愚昧,
不知如何将一TVarBytesField类型的字段设置为TBlobField类型的的永久字段對象,
请举例说明!!!
 
在ADOQUERY1的圖標上按右鍵﹐在彈出來的快捷菜單上點擊“fields editor”,在彈出的窗口
中按右鍵﹐選擇“加入所有字段(Add All Fields)”﹒注意在做這個操作前請在你的ADOQUERY1
的SQL屬性中加入select * from register where idcard=:idcard 這里用了動態參數的方法
在adoquery1.open前﹐需要為這個參數賦值﹒如還有問題請將你的Email告知﹐我郵一個試驗
程序給你﹒
 
改成
var
p : pchar;
TBytesField(FieldByName('image')).Getdata(P);
 
fossil:
对pchar有如何处理,才能将图片显示在Timage控件中,请写详细一些??!!
LiuXu:
对TBlobField类型的字段不需要设置为永久字段也能正常写入和读取,但去TvarBytesField类型的
字段即使设为永久字段,也不能强制转换为Tblobfield类型,请个我一个例子
EMAIL:scjinsui@163.net
谢谢,谢谢!!!
 
如是TVarBytesField字段數据可用下法將數据讀入內存﹐然后由你處理﹕
var MyBuffer :PChar;
begin
with Field1 do
if not IsBlob then
begin
MyBuffer:=GetMem(MyBuffer,DataSize);
try
if not GetData(MyBuffer) then
MessageDlg(DisplayName + ' is NULL .',mtInformation ,[mbOK],0)
else
{在此處理讀到內存中的數据};
finally
FreeMem(MyBuffer);
end;
end;
end;
 
接受答案了.
 
后退
顶部