fastReport怎样保存到数据库中-三层结构 ( 积分: 200 )

  • 主题发起人 主题发起人 duancy
  • 开始时间 开始时间
D

duancy

Unregistered / Unconfirmed
GUEST, unregistred user!
以前我用C/S结构正常,方法是在frDesigner的OnSaveReport事件中添加以下代码
procedure TForm1.frDesigner1SaveReport(Report: TfrReport;
var ReportName: String;
SaveAs: Boolean;
var Saved: Boolean);
var
tempStream : TMemoryStream;
begin
query1.close;
query1.sql.clear;
query1.sql.add('insert into repotable(RptName,RptDesign)');
query1.sql.add('values (:RptName1,:RptDesign1)');
query1.ParamByName('RptName1').asstring := '报表名称';
tempStream:=TMemoryStream.Create;
tempStream.Clear;
try
Report.SaveToStream(tempStream);
query1.ParamByName('RptDesign1').LoadFromStream(tempStream,ftBlob);
finally
tempStream.Free;
end;
query1.execSQL;
Saved := True;
end;

可是现在改成三层结构就不行了,中间层放了一个query,一个dataSetProvider,
Provider属性[poAllowCommandText]=true;
procedure TForm1.frDesigner1SaveReport(Report: TfrReport;
var ReportName: String;
SaveAs: Boolean;
var Saved: Boolean);
var
tempStream : TMemoryStream;
begin
clientdataSet1.close;
clientdataSet1.commandtext := 'insert into repotable(RptName,RptDesign) values (:RptName1,:RptDesign1)';
clientdataSet1.Params.ParamByName('RptName1').asstring := '报表名称';
tempStream:=TMemoryStream.Create;
tempStream.Clear;
try
Report.SaveToStream(tempStream);
clientdataSet1.Params.ParamByName('RptDesign1').LoadFromStream(tempStream,ftBlob);
finally
tempStream.Free;
end;
clientdataSet.execute;
Saved := True;
end;
没有任何出错信息,可是保存的报表是空白。
 
以前我用C/S结构正常,方法是在frDesigner的OnSaveReport事件中添加以下代码
procedure TForm1.frDesigner1SaveReport(Report: TfrReport;
var ReportName: String;
SaveAs: Boolean;
var Saved: Boolean);
var
tempStream : TMemoryStream;
begin
query1.close;
query1.sql.clear;
query1.sql.add('insert into repotable(RptName,RptDesign)');
query1.sql.add('values (:RptName1,:RptDesign1)');
query1.ParamByName('RptName1').asstring := '报表名称';
tempStream:=TMemoryStream.Create;
tempStream.Clear;
try
Report.SaveToStream(tempStream);
query1.ParamByName('RptDesign1').LoadFromStream(tempStream,ftBlob);
finally
tempStream.Free;
end;
query1.execSQL;
Saved := True;
end;

可是现在改成三层结构就不行了,中间层放了一个query,一个dataSetProvider,
Provider属性[poAllowCommandText]=true;
procedure TForm1.frDesigner1SaveReport(Report: TfrReport;
var ReportName: String;
SaveAs: Boolean;
var Saved: Boolean);
var
tempStream : TMemoryStream;
begin
clientdataSet1.close;
clientdataSet1.commandtext := 'insert into repotable(RptName,RptDesign) values (:RptName1,:RptDesign1)';
clientdataSet1.Params.ParamByName('RptName1').asstring := '报表名称';
tempStream:=TMemoryStream.Create;
tempStream.Clear;
try
Report.SaveToStream(tempStream);
clientdataSet1.Params.ParamByName('RptDesign1').LoadFromStream(tempStream,ftBlob);
finally
tempStream.Free;
end;
clientdataSet.execute;
Saved := True;
end;
没有任何出错信息,可是保存的报表是空白。
 
我想改为在中间层操作以上步骤,而前端只传给中间层两个参数RptName1和RptDesign1
那我该怎样在中间层写这个接口。
 
我有一个三层的网上考试系统(不过没有最终完成),你可以下载源码看看,也许对你有些帮助。www.startor.cn
 
楼主这个问题有意思!值得研究
 
我参照Demos/Midas/Login的实例在中间层做了个接口,作用是登录校验,参数用BSTR类型。
可是不知道传图片之类的用什么类型,好多种类型耶,都不知道是干什么的。
 
to 荷塘新月:
你的例子我看了,对我有一定的帮助。特别是你在中间层建立的那些函数/接口。
我想做一个函数,中间层接收前端传来的图片,然后存入数据库。
现在的难点就是图片的传送。
 
//你换个方式行不,不要用SQL Insert,
//直接Select * from repotable
//ClientDataSet1.open
//ClientDataSet1.Insert;
//TBlobField(ClientDataSet1.FieldbyName(RptDesign1)).LoadFromStream(Stream);
// ClientDataSet1.Post;
//if ClientDataSet1.ChangeCount > 0 then
//Caption := IntToStr(ClientDataSet1.ApplyUpdates(0));
//我的Bold字段在三层或SOAP中都可以这样成功保存
 
按照jfyes的方法解决问题了!
 
后退
顶部