本人写的三层系统中,要要用TClentDataSet向数据库(DB2)中插入Blob字段类型的数据,该数据是一个word的文件(write.doc),虽然插了进去(当然Blob字段也进去了),但是读出来的文件却比原文件小,却打不开读出的文件,提示文件无效,请高手指点,写的方法如下:
procedure TForm1.Button3Click(Sender: TObject);
var
stmFiles:Tfilestream;
strFileName:String;
begin
strFileName:='c:\write.doc';
stmFiles:=Tfilestream.Create(strFileName,fmOpenRead);
try
clientdataset1.CommandText:='insert into userid.xt_blob(YHDM,YHMC,YHKL,QM)'+' values(''vts'',''笑眯眯'',''111'',:BB1)';//QM是一个BLOB字段类型.
clientdataset1.Params.CreateParam(ftblob,'BB1',ptInput);
clientdataset1.Params.ParamByName('BB1').LoadFromStream(stmFiles,ftblob);
clientdataset1.Execute;
clientdataset1.Params.Clear;
finally
stmfiles.Free;
end;
end;
注意:
1.数据库的字段大小大于该文件的大小好几倍,所以不存在字段容量不够大的问题
2. 提交的是一个SQL的方法来插入,而不是要用什么Append,Post之类的方法来实现.
3. 本人测试过,用TQuery插入的方法插入后,又用TQuery将其文件读出,一切都正常.但是我用TQuery插入的word文档,用TClientDataSet读出是正常的,所以证明我读出的代码没有任何问题.而用TClientDataSet插入的记录,再用TClientDataSet或TQuery读出后的文件却比原文件小了点,所以文件读出的是坏的,说明用TClientDataSet写入时的文件就不正确了.
4.本人用的TSocketConnection连接,应用服务器端的BDE的BlobSize也设置的正确.所以该问题也排除.
5.但是如果插入的文件是一个txt文件类型时,一切都正确.
6.该问题也等到了一些网友的解答,但是经本人测试,好像也没有作用,也许是本人愚笨,写的不正确,所以烦请各为高手能给出一个完整的,经过测试过的方法,多谢大家的支持,问题一但解决,本人就散分!
本程序的读出代码如下(是正确的):
procedure TForm1.Button2Click(Sender: TObject);
var
stmFiles:Tfilestream;
strFileName:String;
begin
strFileName:='c:\read.doc';
if FileExists(strFileName) then
deletefile(strFileName);
stmFiles:=Tfilestream.Create(strFileName,fmCreate);
try
clientdataset1.CommandText:='select * from userid.xt_blob where yhdm=''vts'''; clientdataset1.Open;
clientdataset1.Last;
clientdataset1.First;
if clientdataset1.RecordCount >0 then
begin
TBlobField(clientdataset1.FieldByName('QM')).SaveToStream(stmFiles);
end;
finally
stmfiles.Free;
end;网友回答例子:
好像用DataSet的参数将BLOB字段的值传递给SQL只对BDE有效,对ClientDataSet或ADO是有问题的。
所以,ClientDataSet或ADODataSet一般都是通过建立其BLOB字段的流对象来实现流操作。TClientDataSet可建立TClientBlobStream类型的流,TADODataSet可建立TADOBlobStream类型的流。
在DELPHI的后期版本中还专门为TDataSet设计了一个虚函数CreateBlobStream,让不同类型的DataSet自己实现具体流。
你改成这样试试:
......
ClientDataSet1.CommandText := 'select * from atable';
ClientDataSet1.Open;
ClientDataSet1.Append;
aStream := ClientDataSet1.CreateBlobStream('aBlobFieldName', bmReadWrite);
aStream.CopyFrom(aFileStream, 0);
...... 这些代码只是示范,有错当查!李战.深圳
文件大小相同吗?
我用tdataset.fieldby('bb1').asblob.loadfromstream(fp)存,没使用过这种方法存。
你读文件的代码拿出来看看
cds.Edit;
TBlobField(Cds.FindField('blob')).LoadFrom(MyMemoryStream);
cds.Post;
cds.ApplyUpdate;
procedure TForm1.Button3Click(Sender: TObject);
var
stmFiles:Tfilestream;
strFileName:String;
begin
strFileName:='c:\write.doc';
stmFiles:=Tfilestream.Create(strFileName,fmOpenRead);
try
clientdataset1.CommandText:='insert into userid.xt_blob(YHDM,YHMC,YHKL,QM)'+' values(''vts'',''笑眯眯'',''111'',:BB1)';//QM是一个BLOB字段类型.
clientdataset1.Params.CreateParam(ftblob,'BB1',ptInput);
clientdataset1.Params.ParamByName('BB1').LoadFromStream(stmFiles,ftblob);
clientdataset1.Execute;
clientdataset1.Params.Clear;
finally
stmfiles.Free;
end;
end;
注意:
1.数据库的字段大小大于该文件的大小好几倍,所以不存在字段容量不够大的问题
2. 提交的是一个SQL的方法来插入,而不是要用什么Append,Post之类的方法来实现.
3. 本人测试过,用TQuery插入的方法插入后,又用TQuery将其文件读出,一切都正常.但是我用TQuery插入的word文档,用TClientDataSet读出是正常的,所以证明我读出的代码没有任何问题.而用TClientDataSet插入的记录,再用TClientDataSet或TQuery读出后的文件却比原文件小了点,所以文件读出的是坏的,说明用TClientDataSet写入时的文件就不正确了.
4.本人用的TSocketConnection连接,应用服务器端的BDE的BlobSize也设置的正确.所以该问题也排除.
5.但是如果插入的文件是一个txt文件类型时,一切都正确.
6.该问题也等到了一些网友的解答,但是经本人测试,好像也没有作用,也许是本人愚笨,写的不正确,所以烦请各为高手能给出一个完整的,经过测试过的方法,多谢大家的支持,问题一但解决,本人就散分!
本程序的读出代码如下(是正确的):
procedure TForm1.Button2Click(Sender: TObject);
var
stmFiles:Tfilestream;
strFileName:String;
begin
strFileName:='c:\read.doc';
if FileExists(strFileName) then
deletefile(strFileName);
stmFiles:=Tfilestream.Create(strFileName,fmCreate);
try
clientdataset1.CommandText:='select * from userid.xt_blob where yhdm=''vts'''; clientdataset1.Open;
clientdataset1.Last;
clientdataset1.First;
if clientdataset1.RecordCount >0 then
begin
TBlobField(clientdataset1.FieldByName('QM')).SaveToStream(stmFiles);
end;
finally
stmfiles.Free;
end;网友回答例子:
好像用DataSet的参数将BLOB字段的值传递给SQL只对BDE有效,对ClientDataSet或ADO是有问题的。
所以,ClientDataSet或ADODataSet一般都是通过建立其BLOB字段的流对象来实现流操作。TClientDataSet可建立TClientBlobStream类型的流,TADODataSet可建立TADOBlobStream类型的流。
在DELPHI的后期版本中还专门为TDataSet设计了一个虚函数CreateBlobStream,让不同类型的DataSet自己实现具体流。
你改成这样试试:
......
ClientDataSet1.CommandText := 'select * from atable';
ClientDataSet1.Open;
ClientDataSet1.Append;
aStream := ClientDataSet1.CreateBlobStream('aBlobFieldName', bmReadWrite);
aStream.CopyFrom(aFileStream, 0);
...... 这些代码只是示范,有错当查!李战.深圳
文件大小相同吗?
我用tdataset.fieldby('bb1').asblob.loadfromstream(fp)存,没使用过这种方法存。
你读文件的代码拿出来看看
cds.Edit;
TBlobField(Cds.FindField('blob')).LoadFrom(MyMemoryStream);
cds.Post;
cds.ApplyUpdate;
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货