求救:水晶报表登录失败

左直拳
博客专家认证
2003-10-13 10:45:40
我用 PUSH模式 搞了个水晶报表:test.rpt,数据源用ADO.NET(XML):data.xsd,里面有张表:tTest;
然后做了张页面 print.aspx 来调用此报表,把它导出为PDF格式的文档。

print.aspx.vb代码如下:

Dim ds As New DataSet()
Dim dt As New DataTable()
Dim doc As New CrystalDecisions.CrystalReports.Engine.ReportDocument()

'调用自己写好的取数据类取得数据放在了 dt 里
……

'将表名换成报表数据源里的表名
dt.TableName = "tTest"

'合成进表集合 ds 里
ds.Merge(dt)

'加载报表
doc.Load("c:\test.rpt")

'将 ds 传给报表
doc.SetDataSource(ds)

'刷新
doc.Refresh()

'导出到PDF文档
Dim diskoptions As New CrystalDecisions.Shared.DiskFileDestinationOptions
diskoptions.DiskFileName ="c:\test.pdf"
doc.ExportOptions.DestinationOptions = diskoptions
doc.ExportOptions.ExportDestinationType = CrystalDecisions.[Shared].ExportDestinationType.DiskFile
doc.ExportOptions.ExportFormatType = CrystalDecisions.[Shared].ExportFormatType.PortableDocFormat
'导出
doc.Export()

在开发机(2000)上运行,一切正常;移植到生产机(2003),就报错。错误提示:连接失败。错误的登录参数。

开发机上装有水晶报表9.0,而生产机上装有从开发机上打包的部署程序。开始我认为是部署包不全,但将开发机的水晶报表卸载,再安装部署包,仍然正常。

我又曾经尝试将数据源文件 data.xsd 删除或改名,但开发机上还是一切正常。

是不是很奇怪?大家救我啊!






...全文
133 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
yan1617 2003-10-29
  • 打赏
  • 举报
回复
UP
左直拳 2003-10-29
  • 打赏
  • 举报
回复
各位,因为前段时间太忙,耽误了结贴,实在是不好意思得很,请原谅。

我这个水晶报表屡屡提示登录失败的问题现在终于告一段落了。症结在于部署包做的不全。但我也认为水晶报表的部署实在是太难,相关的资料又不齐,如果不是运气好的话,真不知道搞到什么时候!我将我的部署包介绍一下,希望能对大家有一点帮助。

我做了两个安装包。

包一:

1、打开VS.NET,新建-》项目-》安装部署项目,选“安装项目”

2、项目生成后,用鼠标右击安装项目,选“添加”-》“合并模块”

3、选择以下合并模块:
Crystal_Database_Access2003_chs.msm
Crystal_Managed2003_chs.msm
Crystal_regwiz2003.msm
DotNETCrystalReports.msm

这时项目会自动检测到依赖项:
Crystal_Database_Access2003.msm
Crystal_managed2003.msm

注意:标有2003字样的合并模块需要安装了VS.NET2003才有。我自己的机器是WIN2000,VS.NET2002,装有水晶报表9.2,
而我同事的机器是WIN2003,VS.NET2003,他的水晶报表跟我的是同一张安装盘,但彼此的合并模块居然不一样!

4、然后编译、生成


包二:

1、打开VS.NET,新建-》项目-》安装部署项目,选“安装项目”

2、项目生成后,用鼠标右击安装项目,选“添加”-》“合并模块”

3、选择以下合并模块:
reportengine_chs.msm,
crnetruntime_chs.msm
license_chs.msm
mapping_chs.msm (可选,当在报表中使用了geographic maps时)
VC_CRT.msm、VC_STL.msm( 如果您部署的 Windows 应用程序使用 ADO.NET 数据集,则还需要包括 VC_CRT 和 VC_STL 合并模块)

注意:以上合并模块需要到crystal的官方网站support.crystaldecisions.com下载一个包cr9netmergemodules_chs.zip。

4、然后编译、生成

在部署机器上依次安装包一、包二,问题得以解决。注意如果之前有安装其他包,请务必卸载净尽再安装这两个包。有意思的是,两个包都安装好后,
将包一卸载,水晶报表仍然运行正常。不知道什么原因。

或许将两个包的内容合在一起也可以?我实在没有兴趣和机器再去测试了。如果有人试验过,不防告诉大家。

我讨厌水晶报表。



haibodotnet 2003-10-15
  • 打赏
  • 举报
回复
Crystal Reports 9 最新补丁下载(搜集:海波.NET)

(1)Crystal Reports 9 Database and Export Drivers Monthly Hot Fix
http://support.crystaldecisions.com/communityCS/FilesAndUpdates/cr90dbexwin_en.zip.asp?recDnlReq=Record&dnlPath=cr90dbexwin_en.zip
(2)Crystal Reports 9 Developer Files Monthly Hot Fix
http://support.crystaldecisions.com/communityCS/FilesAndUpdates/cr90devwin_en.zip.asp?recDnlReq=Record&dnlPath=cr90devwin_en.zip
(3)Crystal Reports 9.0 Main Program Files Monthly Hot Fix
http://support.crystaldecisions.com/communityCS/FilesAndUpdates/cr90mainwin_en.zip.asp?recDnlReq=Record&dnlPath=cr90mainwin_en.zip
wjhs 2003-10-15
  • 打赏
  • 举报
回复
前面有一个刚揭贴的帖子,也是同样的问题,你可以看一下。
左直拳 2003-10-15
  • 打赏
  • 举报
回复
谢谢各位的热心支持!这个问题已经初步得到解决。

原来是我的部署包少了点东西:

Crystal_Database_Access2003.msm
Crystal_Database_Access2003_chs.msm

这两个合并模块包含各种连接数据源的驱动。所以少了它,就老是提示登录失败(这种提示是不是很莫名其妙?)

注意这两个合并模块要安装了VS.NET2003才有,安装了水晶报表9.2也无济于事!我的开发机是2000,就找不到它们。

呜呼!遍寻互连网,有哪一篇介绍水晶报表安装部署的文章有提到上面这两个合并模块的?有的只是关于老旧版本的介绍。MSDN2003上虽然有提到,但它列出的合并模块也不全,照单抓药仍然会出错!

也许我要部署的生产机操作系统是2003,才需要这两个合并模块,如果是2000,或98,情况当有所不同。等我测试后再来结贴给分。

有关。NET下部署,可以看以下文章:

http://www.csdn.net/Develop/Read_Article.asp?Id=17978
haibodotnet 2003-10-14
  • 打赏
  • 举报
回复
彻底解决 CrystalReports 登录失败问题(海波.NET,更新:2003-10-14)
问题:
CrystalReports 登录失败
---------------------------------------------------------------
原因一: NTFS 文件夹权限的问题!
文件夹:
VS.NET Crystal Reports:
C:\Program Files\Microsoft Visual Studio .NET\Crystal Reports\Viewers
Crystal Reports 9.2:
C:\Program Files\Common Files\Crystal Decisions\2.0\crystalreportviewers
设置上述文件夹的“安全”,即NTFS 文件夹权限的问题!
1、添加当前用户,比如 Administrator,,权限“写入”;
2、为用户 ASPNET、SYSTEM、匿名用户(通常为 IUSR_MACHINENAME)、经过身份验证的请求用户添加“写入”权限!
---------------------------------------------------------------
原因二:数据库登录问题
在报表的cs文件中,加上数据库连接。
1.TableLogonInfo
.使用TableLogonInfo
Dim ReportDoc As New ReportDocument()
Dim logonInfo As New TableLogonInfo
Dim table As table
ReportDoc.Load("C:\Rpts\publish.rpt")
For Each table IN ReportDoc.DataBase.Tables
logonInfo= table.LogonInfo
with logonInfo.connectioninfo
.serverName= "Localhost"
.Databasename= "pubs"
.UserID= "sa"
.Password=""
End With
table.applyLogonInfo(logonInfo)
next table
Crviewer.reportsource= reportDoc
2.如果是多個相關表格生成的報表,最好以存儲過程為數據源建立報表


代码放在 Page_load 事件里!
试试 info.ConnectionInfo.ServerName = "Localhost"
用户名和密码的正确性再确定一下!
——————————————————————————————————————
调试成功后,可以考虑:
将“数据库连接信息”存放在 web.config 配置文件,容易维护
——————————————————————————————————————
using CrystalDecisions.Shared ; //负责解释TableLogOnInfo类
using CrystalDecisions.CrystalReports.Engine ; //负责解释ReportDocument类

private void Page_Load(object sender, System.EventArgs e)
{
TableLogOnInfo logOnInfo = new TableLogOnInfo ();
//这里必须事先申明一个ReportDocument对象 Report,同时加载数据报表
ReportDocument oRpt = new ReportDocument();
//获取.rpt文件真实路径
string path;
path=Server.MapPath ("cr.rpt");
oRpt.Load (path);

//从web.config中获取logOnInfo参数信息
string a,b,c,d;
//获取ServerName
a=System.Configuration.ConfigurationSettings.AppSettings ["servername"];
//获取DatabaseName
b=System.Configuration.ConfigurationSettings.AppSettings ["database"];
//获取UserId
c=System.Configuration.ConfigurationSettings.AppSettings ["userid"];
//获取password
d=System.Configuration.ConfigurationSettings.AppSettings ["pass"];
//设置logOnInfo参数
logOnInfo.ConnectionInfo.ServerName = a;
logOnInfo.ConnectionInfo.DatabaseName = b;
logOnInfo.ConnectionInfo.UserID = c;
logOnInfo.ConnectionInfo.Password = d;

oRpt.Database .Tables [0].ApplyLogOnInfo (logOnInfo);

//建立.rpt文件与CryStalReportviewer文件之间的连接
CrystalReportViewer1.ReportSource = oRpt;

DataBind();
}
——————————————————————————————————————
附件:
海波.NET
问题:
安全之道:crystalreport 的集成认证如何与NT(2K)SERVER集成??
——————————————————————————————————————
安全三要素:
模拟,验证,授权
——————————————————————————————————————
如果运行 ASP.NET 程序,还需要为 ASPNET 账号——运行 ASP.NET 模拟的账号,做下述设置:

1、通过 Web 访问服务器,访问者默认“模拟”的是——Internet 来宾帐号,账号名:IUSR_计算机名;
2、“IUSR_计算机名”账号要访问 SQL SERVER,必须为该帐号建立“登录”(验证也!);
3、并授予“服务器角色”和“数据库访问许可”、“数据库角色”(授权也)!
——————————————————————————————————————
参考:
1、匿名访问 Web 所模拟的账号
账号名:IUSR_计算机名
全名:Internet 来宾帐号
描述:匿名访问 Internet 信息服务的内置帐号

2、运行 ASP.NET 模拟的账号
账号名:ASPNET
全名:aspnet_wp account
描述:运行 ASP.NET 工作进程的账号
左直拳 2003-10-14
  • 打赏
  • 举报
回复
to herofyf:

在报表设计器中将报表登录,并选择了xsd文件,保存,上传至生产机,仍然失败.

数据引擎不就是那几个合并文件: data_access.msm,data_access_chs.msm,vc_crt.msm,vc_stl.msm 吗?都打包了.

herofyf 2003-10-14
  • 打赏
  • 举报
回复
你将数据库dataset.xsd保存一下,然后在报表中先”登录“一下,注意此处的登录要选择用"asp xml数据源“类型,根据系统提示选择此dataset.xsd文件!,然后再运行一次!如再不行就是你没将相应的数据引擎打包进去啊!
haibodotnet 2003-10-14
  • 打赏
  • 举报
回复
大家一起去这个贴子支持一下!!!
http://expert.csdn.net/Expert/TopicView1.asp?id=2291055
CSDN 开个 Crystal Report 版吧!!!&&&我与水晶报表……
haibodotnet 海波.NET

想了解更多水晶报表的知识和技巧,请到
NET专栏 -> 水晶报表专栏
http://218.56.11.178:8009/
jpyc(九品御厨-进军嵌入式)
haibodotnet 2003-10-14
  • 打赏
  • 举报
回复
彻底解决 CrystalReports 登录失败问题(海波.NET)
问题:
CrystalReports 登录失败
---------------------------------------------------------------
原因一: NTFS 文件夹权限的问题!
文件夹:
VS.NET Crystal Reports:
C:\Program Files\Microsoft Visual Studio .NET\Crystal Reports\Viewers
Crystal Reports 9.2:
C:\Program Files\Common Files\Crystal Decisions\2.0\crystalreportviewers
设置上述文件夹的“安全”,即NTFS 文件夹权限的问题!
1、添加当前用户,比如 Administrator,,权限“写入”;
2、添加用户 ASPNET、SYSTEM,权限“写入”!
---------------------------------------------------------------
原因二:数据库登录问题
在报表的cs文件中,加上数据库连接。
1.TableLogonInfo
.使用TableLogonInfo
Dim ReportDoc As New ReportDocument()
Dim logonInfo As New TableLogonInfo
Dim table As table
ReportDoc.Load("C:\Rpts\publish.rpt")
For Each table IN ReportDoc.DataBase.Tables
logonInfo= table.LogonInfo
with logonInfo.connectioninfo
.serverName= "Localhost"
.Databasename= "pubs"
.UserID= "sa"
.Password=""
End With
table.applyLogonInfo(logonInfo)
next table
Crviewer.reportsource= reportDoc
2.如果是多個相關表格生成的報表,最好以存儲過程為數據源建立報表


代码放在 Page_load 事件里!
试试 info.ConnectionInfo.ServerName = "Localhost"
用户名和密码的正确性再确定一下!
——————————————————————————————————————
调试成功后,可以考虑:
将“数据库连接信息”存放在 web.config 配置文件,容易维护
——————————————————————————————————————
using CrystalDecisions.Shared ; //负责解释TableLogOnInfo类
using CrystalDecisions.CrystalReports.Engine ; //负责解释ReportDocument类

private void Page_Load(object sender, System.EventArgs e)
{
TableLogOnInfo logOnInfo = new TableLogOnInfo ();
//这里必须事先申明一个ReportDocument对象 Report,同时加载数据报表
ReportDocument oRpt = new ReportDocument();
//获取.rpt文件真实路径
string path;
path=Server.MapPath ("cr.rpt");
oRpt.Load (path);

//从web.config中获取logOnInfo参数信息
string a,b,c,d;
//获取ServerName
a=System.Configuration.ConfigurationSettings.AppSettings ["servername"];
//获取DatabaseName
b=System.Configuration.ConfigurationSettings.AppSettings ["database"];
//获取UserId
c=System.Configuration.ConfigurationSettings.AppSettings ["userid"];
//获取password
d=System.Configuration.ConfigurationSettings.AppSettings ["pass"];
//设置logOnInfo参数
logOnInfo.ConnectionInfo.ServerName = a;
logOnInfo.ConnectionInfo.DatabaseName = b;
logOnInfo.ConnectionInfo.UserID = c;
logOnInfo.ConnectionInfo.Password = d;

oRpt.Database .Tables [0].ApplyLogOnInfo (logOnInfo);

//建立.rpt文件与CryStalReportviewer文件之间的连接
CrystalReportViewer1.ReportSource = oRpt;

DataBind();
}
左直拳 2003-10-14
  • 打赏
  • 举报
回复
好,先去下个包看看.

蝈蝈俊 2003-10-14
  • 打赏
  • 举报
回复
push方式,不存在登录数据库的问题。

这是crystal的一个bug,到crystal官方网站上去搜一下这个补丁:CR90DBEXWIN_EN.ZIP

补丁在:

http://support.crystaldecisions.com/communityCS/FilesAndUpdates/cr90dbexwin_en.zip.asp
yoobj 2003-10-14
  • 打赏
  • 举报
回复
up
haibodotnet 2003-10-14
  • 打赏
  • 举报
回复
PUSH 模式不需要设置 TableLogOnInfo!!!
因为数据源是 DataSet,不是数据库!!!
左直拳 2003-10-14
  • 打赏
  • 举报
回复
但问题是:数据我已经取了出来了,放在 dataset 里,然后传给水晶报表。这时候,水晶报表还要登录到哪里去?

我用的数据源是一个基于XML的后缀名为.XSD的文件,并非SQL SERVER 或其他数据库,这个文件只描述数据结构,例如字段名,类型,而没有数据。

假如我这样写,就不会出错:

'调用自己写好的取数据类取得数据放在了 dt 里
dt= ……
'将表名换成报表数据源里的表名
dt.TableName = "tTest"
'合成进表集合 ds 里
ds.Merge(dt)
'加载报表
doc.Load("c:\test.rpt")

'将 ds 传给报表
doc.SetDataSource(ds)

'**************************************************
'设置登录信息
Dim logoninfo As TableLogOnInfo
logoninfo= New TableLogOnInfo()
With logoninfo.ConnectionInfo
.ServerName = ""
.DatabaseName = "data.xsd"
.UserID = ""
.Password = ""
End With
doc.Database.Tables(0).ApplyLogOnInfo(logoninfo)
'***************************************************************

但是这样虽不出错,但数据却空空如也!但dataset里是有数据的。可能它读了data.xsd后,数据就被没有数据的data.xsd置换掉了。

我猜测是这样的:报表装载时,需要读数据库设置,在这里就是去读XSD文件的设置,然后再将DATASET里的数据往里填。

但是问题出在哪里?

110,500

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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