关于Tblobfield的大字段问题(200分)

  • 主题发起人 主题发起人 tian7009
  • 开始时间 开始时间
T

tian7009

Unregistered / Unconfirmed
GUEST, unregistred user!
我在使用delphi和后台的sql server 7.0进行连接的时候,在一个表中
有一个image的大字段,当我用
Tblobfield(query1.fieldbyname('aa')).loadfile('c:/aa/dd.exe')
将一个.exe文件保存到数据库中,这个文件可能有5,6M大小,存放不
进去不知道为什么,但是小于1M的文件就没有问题,不知道为什么,
不知道我有没有说清楚,请各位大虾帮一帮忙,我在这里谢过了,
还有就是我用的是三层结构,不能使用ado,用的是odbc连接数据库
 
var
StreamTemp :TMemoryStream;
begin
...
// 先把文件存入stream,省略了
Query1.ParamByName('aa').LoadFromStream(StreamTemp,ftBlob);
...
end;
 
本人水平实在太差,请R_Baggio说的详细些,谢谢
 
// 先把文件存入stream,省略了
var
StreamTemp :TMemoryStream;
Bit :TBitmap;
begin
Bit := TBitmap.Create;
Bit.LoadfromFile('xxx');
Bit.SavetoStream();
...

...
Bit.Free;
end;
不用再说了吧!
 
好像不行,我的文件不是图像文件,是任意类型文件,大多是.exe文件,不过还是
谢谢R_Baggio
 

任意类型文件也可以呀

var myStream : TFileStream;

myStream := TFileStream.Create(FileName, fmOpenRead);

然后就可用

myStream.Position := 0; //将流复位

ParamByName('字段名').LoadFromStream(myStream,ftBlob);

存入库中
 
同意airdreamer,TBLOB字段并不一定要图象文件,任意文件都可以。
 
因为我用的是三层结构,
所以clientdataset没有parambyname的参数,
airdreamer所提的方法中
query1.Params.ParamByName('aa').LoadFromStream(myStream,ftBlob)
系统告诉我没有'aa'的参数,所以还是不行
ParamByName('aa')中'aa'是一个参数不是一个字段
 
你该不会连参数都不会吧!!!
insert into a(name,sex) values(:aa,:bb)
 
还是不行,我的一个9M的文件放到数据库中只有33k了
 
mystream := TFileStream.Create('d:/setup/XT97_95311.ZIP',fmOpenRead);
mystream.Position := 0;
showmessage(inttostr(mystream.Size));
query1.sql.clear;
query1.sql.Add('insert into aa (aa) values (:aa)');
query1.ParamByName('aa').LoadFromStream(myStream,ftBlob);
query1.ExecSQL;
这样对吗?
但是只有33k可以放进去,剩下的不知到哪里去了
 
试试这个:
mystream := TMemoryStream.Create;
mystream.loadfromfile('d:/setup/XT97_95311.ZIP');
showmessage(inttostr(mystream.Size));
mystream.seek(0,soFromBeginning);
query1.sql.clear;
query1.sql.Add('insert into aa (aa) values (:aa)');
query1.ParamByName('aa').LoadFromStream(myStream,ftBlob);
//或ftTypedBinary都试试
query1.ExecSQL;
 
好像还是不行,我用以下语句取出来不知道是否正确
query1.sql.Add('select * from aa');
query1.close;
query1.open;
aa := tblobfield(query1.fieldbyname('aa'));
showmessage(inttostr(aa.BlobSize));
mystream := TblobStream.Create(aa,bmread);
mystream.Position := 0;
Tblobfield(query1.fieldbyname('aa')).SaveToStream(mystream);
a := mystream.Size;
showmessage(inttostr(a));
Tblobfield(query1.fieldbyname('aa')).SaveTofile('c:/XT97_95311.ZIP');

 

直接 Tblobfield(query1.fieldbyname('aa')).SaveTofile('c:/XT97_95311.ZIP');打不开吗?
用OICQ吧 8837234,登陆太麻烦。
 
接受答案了.
 
后退
顶部