为什么水晶报表在windows server 2003无法访问(在线等待,谢谢)

izzard 2003-08-20 11:23:35
为什么,我在windows server 2003中 部署ASP.net应用程序,应用中使用了水晶报表,但为什么win2003系统中,无法访问水晶报表,(在win2000中就可以),好像在 \program files\VisualStudio.net\Crystal Reports\Viewers下没有dynamic_images目录,请问怎样解决
...全文
137 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangbat 2004-02-09
  • 打赏
  • 举报
回复
没有楼上说的那么麻烦,
我去年遇到过这个问题,win2k3 + VS.net 2002 ,是没法访问水晶报表的图片文件,
已经给微软客服打电话解决了这个问题,
不知道对你有没有帮助,,

解决方法见下:

张先生,您好!

根据您在电话中的确认,该问题已在您的Win2003机器上解决。因此,我们已将该Case存档。

以下是关于该Case的一个总结:

问题描述:
在Win2003上运行使用Crystal Report的ASP.NET程序会报对路径“dynamic_images”的访问被拒绝的错误。

解决方法:
1、给予Network Service帐号对C:\windows\system32\inetsrv\dynamic_images目录的访问权限。
2、将C:\windows\system32\inetsrv\dynamic_images 映射成CrystalReportWebFormViewer虚拟目录下的一个虚拟目录。

再次感谢您使用微软产品!

Best Regards,
Elan Zhou
Microsoft Developer support
izzard 2004-02-04
  • 打赏
  • 举报
回复
问题仍未解决,请高手帮助
izzard 2003-09-19
  • 打赏
  • 举报
回复
就是用 DotNETCrystalReports.msm 打到安装包中的,在win2000 Server可以,在win2003 server不行,在2003下手动建dynamic_images目录也不行
yesky_2001 2003-09-09
  • 打赏
  • 举报
回复
呵呵 楼上的既然说了,我还是把code贴完吧,楼主可以自己选择:)
服务器端
{ TPrintService }
TPrintService = class(TInvokableClass, IPrintService)
private
procedure CompressStream(const SourceStream: TMemoryStream; var DestStream: TMemoryStream);
procedure DeCompressStream(const SourceStream: TMemoryStream; var DestStream: TMemoryStream);
function FileToBase64Str(const FrpFileName: string): WideString;
public
function GetReportBase64Data(const SQL: string; const ReportFileName: string): WideString; stdcall;
end;

implementation

uses PDM;

procedure TPrintService.CompressStream(const SourceStream: TMemoryStream; var DestStream: TMemoryStream);
var
CompressionStream: TCompressionStream;
TmpStream: TMemoryStream;
Size: Integer;
begin
Size := SourceStream.Size;
TmpStream := TMemoryStream.Create;
try
CompressionStream := TCompressionStream.Create(cldefault, TmpStream);
SourceStream.SaveToStream(CompressionStream);
CompressionStream.Free; //只有调用free才开始压缩
DestStream.Clear;
DestStream.Write(Size, Sizeof(Size));
DestStream.CopyFrom(TmpStream, 0);
finally
TmpStream.Free;
end;
end;

procedure TPrintService.DeCompressStream(const SourceStream: TMemoryStream; var DestStream: TMemoryStream);
var
Size: Integer;
Buffer: PChar;
DeCompressionStream: TDeCompressionStream;
begin
try
SourceStream.Read(Size, Sizeof(Size));
GetMem(Buffer, Size);
DeCompressionStream := TDeCompressionStream.Create(SourceStream);
DeCompressionStream.ReadBuffer(Buffer^, Size);
DestStream.Clear;
DestStream.WriteBuffer(Buffer^, Size);
finally
FreeMem(Buffer);
DeCompressionStream.Free;
end;
end;

function TPrintService.FileToBase64Str(const FrpFileName: string): WideString;
var
MemStream, DestStream: TMemoryStream;
StrStream: TStringStream;
begin
MemStream := TMemoryStream.Create;
DestStream := TMemoryStream.Create;
StrStream := TStringStream.Create('');
try
try
MemStream.LoadFromFile(FrpFileName);
CompressStream(MemStream, DestStream);
DestStream.SaveToStream(StrStream);
Result := EnCodeString(StrStream.DataString);
except
Result := '';
end;
finally
StrStream.Free;
DestStream.Free;
MemStream.Free;
end;
end;

function TPrintService.GetReportBase64Data(const SQL: string; const ReportFileName: string): WideString; stdcall;
var
MyDM: TDM;
TmpFileName: string;
begin
MyDM := TDM.Create(nil);
Randomize();
TmpFileName := 'c:\\' + IntToStr(GetTickCount()) + IntToStr(Random(10000)) + 'tmp.frp';
try
try
MyDM.SQLDataSet1.Close;
MyDM.SQLDataSet1.CommandText := SQL;
MyDM.SQLConnection1.Open;
MyDM.SQLDataSet1.Open;
if (MyDm.frReport1.LoadFromFile(ReportFileName) = True) then
begin
if (MyDm.frReport1.PrepareReport = True) then
begin
MyDM.frReport1.SavePreparedReport(TmpFileName);
Result := FileToBase64Str(TmpFileName);
try
DeleteFile(Pchar(TmpFileName));
except
end;
end
else
begin
Result := '';
end;
end
else //打开报表文件失败时
begin
Result := '';
end;
except
Result := '';
end;
finally
MyDM.Free;
end;
end;


initialization
{ Invokable classes must be registered }
InvRegistry.RegisterInvokableClass(TPrintService);

end.
lxstruggle 2003-09-09
  • 打赏
  • 举报
回复
水晶报表已经提供了分发包的哦!可以直接搞定!
lxstruggle 2003-09-09
  • 打赏
  • 举报
回复
是可以解决的哈,和我联系呢:QQ:80330179
yesky_2001 2003-09-09
  • 打赏
  • 举报
回复
测试用的html文件内容
<table height="100%" width="100%" border=0 cellpadding=0 cellspacing=0>
<tr height="100%">
<td valign="top">
<OBJECT id="MyViewer"
classid="clsid:6F5BD049-C3A9-4E78-9A5E-143A68CAB48B"
width=100% height=100%
codebase="/printformocx.ocx#version=1,0,0,0">
</OBJECT>
<TEXTAREA id="MRVIEWER_DATA" style="display:none">JyUAAHicvZq9blxFFMePN96913aCKJBIFCnZAuiQ7vdHaa8sR4kdHK1CKJmsJ+uR7t5B98NJ3FDQ
0FHQkCpFyhR5AAoeIJHyABQ8BgXFMhszCKXgDzOjXelK3rGvfz4zvz3nzFxfow9o/5tW1uPDe5+H
WRDcoQERvblBtEWJT/RsR71dLok26L3XNRrSEV/IUN3xiXo/U9fX6vpIXZfonzcsl8ubG+r37TZz
XneiZhfDA/1DQ/UdwSrafo8w0F9cgCI18NN/AF2mvZ7Xsh3vioa3ZqxYDXyobpgD1hWayr47He8u
eCNmhoElauD7DRyYR1Ge50WYmmFSNbA5wBif4igO1Cs242ghnsNw9mQlzoSlDggzokM2PmbnZhQt
wgtAcSoCnrkwKIs0txQBY/J3HgRmGO3BrwAzor2GnYvKjKI1QBR/RWlFZaqbFuE3wHEqAgrKoyIN
w7DMzDBaBITZojANEgcqfLyBVJiwmp1YZgRM+aLr2GNLEa4DyhW6KxtXIqCQPCrLPAuT3AyjRUAY
n6IsdeDBFHCGNDkVFTeDaA0QxKcpU+0Im0szjhbhARTBYUZAQY0oT7MyMSzd2gM8dWEcOfDgB8iZ
yEouHtr2CIijSpDSoLPMCD+uUwQUkuoRwrgoA8uMgFcovugRLE14DTibNOkfWlqAGCO6xc6Y6fZE
W/B2nXUBhxSGSRolZhQtAaKodBBkDiTwBsjp/VnPTmRjhtEeIMyQ7vWis6wKOwDiNBmgiEaUpGka
RGYUrQGiuNJgAjg7tF+Np6w6s1cBoS6vegRLljbiABrhMDGgwIYUBUVmuYFEEI9SFxvIb6HdB/1T
47ytVUCUbTrgspnzTj6uzUhahO/WmRrw5EVhUmalGUWbgCmFAxF+hr7dZgtmPGXaBITx6Y6o520n
LT34ZZ0JAQU1XHUKto0CXqDIxfbxd2jbEX8iZoYVXGuAKDt/UcYT0T01Q2kT/linCSgutXMoszws
DBdJu4AwPhWFi24hvoQOr+6qKWvYvLdMCwjk0ZEqQsYY7UIOME5dQDGp/UNcGi+RVgHP3DuIrQkS
YHw6vvDA8NOqRcCc3bavZ8K2PrTQBId9AgpKbSGCLM0tT5oRxaMky+xNeAkwm3TMm96MoS3AjEOx
sMwFr9ZpAApI1YWoSCPbx48I46uG1KgufPbp/39ovTon/bc/5irdr0XHT8bTjnW8HctHdnP9dy0B
3G16wNpT1WVaN5k5ILktJwDmURlncRjb1hOA2aIoKV2cT0sYz/2md1BQAGabjmTd8TNxwi1PpVpA
cltSAEw1F6tnVpYy4DWKgyCyLykAs0Vf8pqf97yyTA0I5NFEdTEzZvmfLa8Axm1pAbARlWEU2D69
RBRfbWxyk6zw1Z9bBeL5
</TEXTAREA>
<SCRIPT LANGUAGE="JavaScript">
<!--
document.all("MyViewer").getValue(document.all("MRVIEWER_DATA").value);
document.all("MyViewer").preview();
//-->
</SCRIPT>
yesky_2001 2003-09-09
  • 打赏
  • 举报
回复
(转贴)自己的解决方法:基本方法是这样的,用com+或web service生成一个fastreport的报表结果文件,将这个结果转成base64格式的字符串,然后再做一个activex form来在客户端显示报表数据。
ActiveX Form的关键源代码
procedure TPrintForm.GetValue(FBase64Str: OleVariant);
begin
Self.FBase64StringData := FBase64Str;
end;

procedure TPrintForm.PreView;
var
SourceStream, DestStream: TMemoryStream;
SourceStrStream: TStringStream;
Str, TmpFileName: string;
begin
//先把base64数据转成非base64数据,然后解压缩
Str := DeCodeString(Self.FBase64StringData);
SourceStrStream := TStringStream.Create(Str);
SourceStream := TMemoryStream.Create;
DestStream := TMemoryStream.Create;
try
try
SourceStream.LoadFromStream(SourceStrStream);
DeCompressStream(SourceStream, DestStream);
TmpFileName := 'c:\\' + IntToStr(GetTickCount) + 'tmp.frp';
DestStream.SaveToFile(TmpFileName);
frReport1.LoadPreparedReport(TmpFileName);
frReport1.ShowPreparedReport;
finally
try
DeleteFile(TmpFileName);
except
end;
end;
finally
try
DestStream.Clear;
except
end;
DestStream.Free;
try
SourceStream.Clear;
except
end;
SourceStream.Free;
end;
end;

procedure TPrintForm.CompressStream(const SourceStream: TMemoryStream; var DestStream: TMemoryStream);
var
CompressionStream: TCompressionStream;
TmpStream: TMemoryStream;
Size: Integer;
begin
Size := SourceStream.Size;
TmpStream := TMemoryStream.Create;
try
CompressionStream := TCompressionStream.Create(cldefault, TmpStream);
SourceStream.SaveToStream(CompressionStream);
CompressionStream.Free; //只有调用free才开始压缩
DestStream.Clear;
DestStream.Write(Size, Sizeof(Size));
DestStream.CopyFrom(TmpStream, 0);
finally
TmpStream.Clear;
TmpStream.Free;
end;
end;

procedure TPrintForm.DeCompressStream(const SourceStream: TMemoryStream; var DestStream: TMemoryStream);
var
Size: Integer;
Buffer: PChar;
DeCompressionStream: TDeCompressionStream;
begin
try
SourceStream.Read(Size, Sizeof(Size));
GetMem(Buffer, Size);
DeCompressionStream := TDeCompressionStream.Create(SourceStream);
DeCompressionStream.ReadBuffer(Buffer^, Size);
DestStream.Clear;
DestStream.WriteBuffer(Buffer^, Size);
finally
FreeMem(Buffer);
DeCompressionStream.Free;
end;
end;
yesky_2001 2003-09-09
  • 打赏
  • 举报
回复
在 2003中是无法使用水晶报表的,MS有解决方案,如果你是正版用户的话可以和MS联系。
izzard 2003-09-09
  • 打赏
  • 举报
回复
CSDN的高手都在哪?为什么没人回答。
acewang 2003-08-20
  • 打赏
  • 举报
回复
没用过2003,up
goody9807 2003-08-20
  • 打赏
  • 举报
回复
自己考一个
zlcoolzl 2003-08-20
  • 打赏
  • 举报
回复
我也遇到同样的问题!
帮你顶……

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧