Crystal Reports 版本迁移问题

时间:2022-07-21 16:37:19
公司一个项目最初是用VS2003+CR10.0.33开发的,后升级到vs2005,Crystal Reports还是10.0.33版本在XP下运行正常。
  现在我把系统放到windows7下运行调试,系统会直接退出DEBUG模式,在SAP一查才发现10.0.33不支持framework2.0
  (我非常纳闷在xp下项目怎么跑的很好呢)。
  于是我把项目中对于Crystal Reports的引用全部改成vs2005自带的10.2.36,这下项目可以对报表进行调试啦。
  但是在修改报表数据源名称时报错

            for(int i =0;i<_crReportDocument.Database.Tables.Count;i++){
        _crReportDocument.Database.Tables[i].Location = aliasName;
            }
            _crReportDocument.SetDataSource(DataSet);
   

  报错信息为:加载数据库信息失败。详细资料: 无法加载数据库 DLL'crdb_query.dll' 。
  想问下各位大大,这是不是因为没有安装完全版的水晶报表导致的?哪有水晶报表10.2的单独安装程序?我在网上找遍啦 都没看到。。。其他版本倒是一大堆。

11 个解决方案

#1


你的水晶报表是拉模式的吗?

#2


不是的 是推模式

#3


private void SetData(DataSet DsReportData, ReportDocument oReport)
{
foreach (Table oTable in oReport.Database.Tables)
  oTable.SetDataSource( DsReportData.Tables[ oTable.Name.ToString() ]);
}

private ReportDocument SetReportData(DataSet DsReportData, ReportDocument oReport)
{
this.SetData(DsReportData,oReport);
foreach(ReportDocument oSubReport in oReport.Subreports)
this.SetData(DsReportData,oSubReport);
return oReport;


把上面的两个方法添上后,直接把:
for(int i =0;i<_crReportDocument.Database.Tables.Count;i++){
  _crReportDocument.Database.Tables[i].Location = aliasName;
  }
  _crReportDocument.SetDataSource(DataSet);

换成:
  SetReportData(DataSet, _crReportDocument);

试试?!

#4


你的错误,我怀疑是由于数据库位置的问题引起的,aliasName代表数据库位置的信息,出了点问题

#5


多谢你的解答,用啦你的代码“无法加载数据库”这个问题ok啦
不过又出现啦新的问题。。。。
我的报表中有2个数据源MainData和PageHeadData
只要是引用了MainData中field的公式字段都会报“该字段名未知”的错误
我将MainData相关字段都删除后,只在报表头放MainData和PageHeadData的field
PageHeadData可以正常显示,MainData为空;另SetDataSource时都有数据

#6


SetReportData(MainData, _crReportDocument);
SetReportData(PageHeadData, _crReportDocument);
这样两个数据源的都给报表赋值了


两数据源相互引用,我还没有过;为什么不放一个DaSet 呢?

一个Daset可能放多张表





#7


我是将2个数据源放在啦一个DataSet里面处理的

#8


现在的状况是通过遍历Report.Database.Tables分别绑定2个表,第2个绑定的表会没有数据显示。
直接通过SetDataSource(DataSet)绑定2个表,会报错“连接字符串中找不到 DSN 。。。错误的登录参数”。
我建啦个小程序把报表单独搬出来,用SetDataSource(DataSet)的方式会弹出啦数据库登录框,
推模式变成了拉模式。。。

#9


我明白了,连接字符串出问题了,你可以调试下?
一般出现这种情况可能是你原来是通过ODBC连接的,在本机上配置数据源或你连接的是ACCESS等这样的数据库,迁移到不同系统或不同电脑时,都容易出问题:
为什么不用经典的用法呢?

SqlConnection con = new Connection();//WEB下ConnectionString是在配置节点
SqlCommand....

SqlDataAdpter...

..Fill(ds)

..Con.Close()

........

这样的话,只是连接字符串没有问题,很少出麻烦

#10


汗 我建的测试小程序就是这样写的 显示报表时变成了弹出数据库登录框。
我修改DataSourceConnections或者SetDatabaseLogon登录现在的数据库怎么都登不上去。。。

#11


还是把代码替全吧,好找问题的所在


SqlConnection con = new Connection();//WEB下ConnectionString是在配置节点
SqlCommand....

SqlDataAdpter...

..Fill(ds)

..Con.Close()


report.SetDataSource(ds.Tables[0]);//直接给表

.............

crystalView1.ReportDocument= report;

........................

这种模式的,我还没有见出现"显示报表时变成了弹出数据库登录框。"

除非:
(1)report.SetDataSource(ds);//直接给ds 
(2)加了crystalReportView控件后,还要添加一个CrystalReportSource(多此一举)
(3)设计时用DataSet1,report.SetDataSource时,根本不用DataSet1中的表






#1


你的水晶报表是拉模式的吗?

#2


不是的 是推模式

#3


private void SetData(DataSet DsReportData, ReportDocument oReport)
{
foreach (Table oTable in oReport.Database.Tables)
  oTable.SetDataSource( DsReportData.Tables[ oTable.Name.ToString() ]);
}

private ReportDocument SetReportData(DataSet DsReportData, ReportDocument oReport)
{
this.SetData(DsReportData,oReport);
foreach(ReportDocument oSubReport in oReport.Subreports)
this.SetData(DsReportData,oSubReport);
return oReport;


把上面的两个方法添上后,直接把:
for(int i =0;i<_crReportDocument.Database.Tables.Count;i++){
  _crReportDocument.Database.Tables[i].Location = aliasName;
  }
  _crReportDocument.SetDataSource(DataSet);

换成:
  SetReportData(DataSet, _crReportDocument);

试试?!

#4


你的错误,我怀疑是由于数据库位置的问题引起的,aliasName代表数据库位置的信息,出了点问题

#5


多谢你的解答,用啦你的代码“无法加载数据库”这个问题ok啦
不过又出现啦新的问题。。。。
我的报表中有2个数据源MainData和PageHeadData
只要是引用了MainData中field的公式字段都会报“该字段名未知”的错误
我将MainData相关字段都删除后,只在报表头放MainData和PageHeadData的field
PageHeadData可以正常显示,MainData为空;另SetDataSource时都有数据

#6


SetReportData(MainData, _crReportDocument);
SetReportData(PageHeadData, _crReportDocument);
这样两个数据源的都给报表赋值了


两数据源相互引用,我还没有过;为什么不放一个DaSet 呢?

一个Daset可能放多张表





#7


我是将2个数据源放在啦一个DataSet里面处理的

#8


现在的状况是通过遍历Report.Database.Tables分别绑定2个表,第2个绑定的表会没有数据显示。
直接通过SetDataSource(DataSet)绑定2个表,会报错“连接字符串中找不到 DSN 。。。错误的登录参数”。
我建啦个小程序把报表单独搬出来,用SetDataSource(DataSet)的方式会弹出啦数据库登录框,
推模式变成了拉模式。。。

#9


我明白了,连接字符串出问题了,你可以调试下?
一般出现这种情况可能是你原来是通过ODBC连接的,在本机上配置数据源或你连接的是ACCESS等这样的数据库,迁移到不同系统或不同电脑时,都容易出问题:
为什么不用经典的用法呢?

SqlConnection con = new Connection();//WEB下ConnectionString是在配置节点
SqlCommand....

SqlDataAdpter...

..Fill(ds)

..Con.Close()

........

这样的话,只是连接字符串没有问题,很少出麻烦

#10


汗 我建的测试小程序就是这样写的 显示报表时变成了弹出数据库登录框。
我修改DataSourceConnections或者SetDatabaseLogon登录现在的数据库怎么都登不上去。。。

#11


还是把代码替全吧,好找问题的所在


SqlConnection con = new Connection();//WEB下ConnectionString是在配置节点
SqlCommand....

SqlDataAdpter...

..Fill(ds)

..Con.Close()


report.SetDataSource(ds.Tables[0]);//直接给表

.............

crystalView1.ReportDocument= report;

........................

这种模式的,我还没有见出现"显示报表时变成了弹出数据库登录框。"

除非:
(1)report.SetDataSource(ds);//直接给ds 
(2)加了crystalReportView控件后,还要添加一个CrystalReportSource(多此一举)
(3)设计时用DataSet1,report.SetDataSource时,根本不用DataSet1中的表