如何将BLOB字段中的文件(较大)取出来(100分)

Y

yibb

Unregistered / Unconfirmed
GUEST, unregistred user!
存一个*.mp3或者*.rm文件到BLOB中,如何顺利的把它取出来?
 
不管文件大小都是一样取的啊
难道还要这样写:
if LobSize < 100M then
...
else
...
不成?[:)]
 
讲具体一点行不行啊?比如说我现在把一个*.rm文件放进去了,我现在要把它取出来并播放,
该怎么做啊!!!会遇到问题的。
 
procedure TForm1.Button1Click(Sender: TObject);
var fs:TFileStream;
begin
Table1.Append;
fs:=TFileStream.create('D:/comm_delphi/小演习/存取BLOB的小例子/ywh.bmp',fmOpenRead);
TBlobField(Table1.FieldbyName('nr')).LoadFromStream(fS); 、
Table1.Post;
fs.Destroy;
end;

procedure TForm1.Button2Click(Sender: TObject);
var doc1:TStream;
fs:TFileStream;
begin
doc1:=table1.CreateBlobStream(table1.FieldByName('nr'),bmRead) ;
fs:=TFileStream.create('D:/comm_delphi/小演习/存取BLOB的小例子/ywh1.bmp',fmcreate);
fs.CopyFrom(doc1,doc1.size);
fs.destroy;
doc1.
 
用流存取
 
如果把Table换成query就会有问题,如果存进去的是3M,出来的时候只能是BDE里设置好的大小(最大为1M),
有哪位知道怎么解决?
 
用流存取,BDE中的blob size 设大一些
 
当BLOB字段大于1M时,运行就会出错,你自己做一个试试就知道了。
 
简单一点,干脆存文件的路径算了,不用这么多麻烦!
 
"当BLOB字段大于1M时,运行就会出错,你自己做一个试试就知道了。"
应该不至于,我曾经做过5M以上的,都没问题的,应该是你的程序哪写错了.
以下是我的一部分代码
dbImage.Params.Clear;
dbImage.Params.Add('Server Name='+AliasIni.ReadString('DatabaseConfig','ServerName',''));
dbImage.Params.Add('Database Name='+AliasIni.ReadString('DatabaseConfig','DatabaseName',''));
dbImage.Params.Add('User Name='+AliasIni.ReadString('DatabaseConfig','UserName',''));
dbImage.Params.Add('Password='+AliasIni.ReadString('DatabaseConfig','Password',''));
dbImage.Params.Add('BLOB SIZE=6000');
dbImage.Params.Add('BLOBS TO CACHE=5120');
dbImage.Params.Add('TDS PACKET SIZE=4096');
dbImage.Connected:=True;
读出的时候这样(我是直接保存到一个文件中的)
TBlobField(myQuery.FieldByName('Accessary')).SaveToFile(FileName);
 
改用ADO做,我就改了,没办法现在好了,多大的图像都给存了
[:D]
 
每个 BLOB 都有一个相应的 SEGMENT,按SEGMENT_SIZE 手工读取(API 方式),
估计一般的数据库 API 都会提供这个功能。具体我也不大清楚,没做过。
 
我的程序有错吗?帮我看看

//存入文件到数据库中
procedure TForm1.Button1Click(Sender: TObject);
var
StrSql : string;
MyMp3File : TMemoryStream;
AFileName : string;
begin
if not Opendialog1.Execute then
exit;
AFileName := Opendialog1.FileName;
MyMp3File := TMemoryStream.Create;
MyMp3File.LoadFromFile(AFileName);
with Query1 do
begin
close;
sql.Clear;
//表中只有两个字段,序号(XH)和备注(BZ,为BLOB长度为10M,存入的是MP3)
StrSql := 'insert into USERID.GZJTEST (xh,bz) values(''1'',:c_bz)';
sql.Add(StrSql);
parambyname('c_bz').LoadFromStream(MyMp3File,ftBlob);
try
ExecSql;
//showmessage(sql.text);
except
MessageBox(0,'SQL语句错误或数据库连接错误!','提示',MB_OK+MB_ICONINFORMATION);
SQL.saveToFile('d:/SQLError.txt');
exit;
end;

end;

end;

//从数据库中读取文件,并存到一个临时文件夹中
procedure TForm1.Button2Click(Sender: TObject);
var
StrSql : string;
MyMp3File : TMemoryStream;
tmpfilepath : string;
begin
with Query1 do
begin
close;
sql.Clear;
StrSql := 'Select bz from userid.gzjtest where xh=''1''';
sql.Add(StrSql);
Open;
last;
first;

MyMp3File := TMemoryStream.Create;
tmpfilepath:='c:/jjgltmp/jjglExcelFile.mp3 '; //临时文件夹路径
TBlobField(fields[0]).savetofile(tmpfilepath);

end;
end;

如果修改BDE的BLOB SIZE 超过1M的话,运行时就会报错,于是每次取出来的时候
文件大小都只有1M。各位高手可以试试。
 
肯定是你的BDE设置的问题,你的BLOB SIZE超过1M报错.应该不会的啊
 
那请教一下Bde该如何设置啊?
 
顶部