水晶报表问题:不能更改数据源!(急)

时间:2021-10-23 14:51:38
我做报表时连接的数据库是Credit2

测试时,连接的数据库应该是Credit2_3

程序(web程序,用asp.net)执行时,希望取得Credit2_3中的数据,但取出来的数据都是Credit2中的数据
我试了各种方法都不行。比如
...
foreach( CrystalDecisions.CrystalReports.Engine.Table  tbl in rep.Database.Tables)
{
log = tbl.LogOnInfo;
log.ConnectionInfo = conn;
tbl.ApplyLogOnInfo(log);

}
this.CrystalReportViewer1.ReportSource = rep;
...(用这种方法时,跟踪,tbl中的连接参数都已经被改成新的了,但数据还是Credit2中的)

而用这种方法:
...
ReportDocument crReport = new ReportDocument();

string strPath=@"C:\Inetpub\wwwroot\Credit2\Enterprise\Reports\employee.rpt";
crReport.Load(strPath);
crReport.SetDataSource(dt);

CrystalReportViewer1.ReportSource = crReport;
CrystalReportViewer1.DataBind();

...(跟踪,dt中的数据是新的,但最后显示出来的页面中的数据还是旧数据)

另:我设计报表时,并没有将数据一起保存。

我猜测,是报表设计时某个选项没设置对

高手们,救命啊!!!多谢!

16 个解决方案

#1


up

#2


up
只能up.自己也很想知道。

#3


up

#4


我这样做没遇到问题:
DataSet thisDataSet = new DataSet();
rptCompact rptComp = new rptCompact();
SqlDataAdapter thisAdapter = new SqlDataAdapter(sqlString,thisConn);
thisAdapter.Fill(thisDataSet,"Compact");
rptComp.Database.Tables[0].SetDataSource(thisDataSet);
rptComp.Database.Tables[0].LogOnInfo.ConnectionInfo.ServerName = strServer;
crystalReportViewer1.ReportSource = rptComp;

#5


你的报表中有没有参数字段啊?如果有的话设置一下ReportViewer的参数字段值!

#6


没有参数。

如果我在设计报表时,在设计器中更改了数据源为Credit2_3,那么取得的数据就是Credit2_3的。但是--我不可能在每次改数据库名字后,为每个报表都重新打开报表,更改一次数据源嘛。

真的要抓狂了

自己UP

#7


目前.NET提供的水晶报表设计并不能满足你的需求。

#8


楼上的,你是在开玩笑吧。

我哭5555555555~~~~~~~~~~~~~~~~~~

#9


我搜索了csdn上所有与“水晶”,“Crystal”相关的帖子,都没有找到我需要的

怎么办嘛5~~~~~~~~~~

#10




不可能连换个DB都不行吧

#11


如果你动态的连接数据库到dataset,你在水晶报表中用到的数据源dataset和你的数据库没有直接的关系,你可以用同一个dataset连接不同的数据库,只要查询出的字段名和类型一样就可以。
我不明白你为什么非要更改数据源(即dataset)。在目前.NET提供的水晶报表设计没有此功能。

#12


TableLogOnInfo logOnInfo = new TableLogOnInfo ();
for(int i=0;i<Rpt.Database.Tables.Count;i++)
{
logOnInfo.ConnectionInfo.ServerName = ServerName;
logOnInfo.ConnectionInfo.DatabaseName = DBName;
logOnInfo.ConnectionInfo.UserID = User;
logOnInfo.ConnectionInfo.Password = Pwd;
Rpt.Database.Tables[i].ApplyLogOnInfo(logOnInfo);
}
试一下这样来改变数据源
楼上说的是PUSH的方法,你也可以考虑一下。但是我觉得如果数据不需要特殊处理的话用PULL方式会更方便!

#13


数据库你不是在web.config中文件配置,需要时在修改就成了,你的程序需要在什么时候作数据库的更换,两个数据库的表结构是一样的吗?

#14


我的问题和楼主是一样的,就像楼上老兄说的
我的两个数据库是一摸一样的
应用程序都能访问 就是一到水晶报表就提示打开行集失败
我都快急死了!救命呀

#15


唉,自己搞定了,CSDN又让我失望了(同时还有水晶报表这个破东东)
不过还是谢谢大家的帮助:)

---------------------------
找出了两种解决方法。
方法一:这是我找出来了:)
不使用水晶报表中的向导连接DB中的TABLE,而是使用命令(Command)方法健报表的SQL。用这种方法后,显示报表时,它就不会再到以前的DB中找数据了。

方法二:这是我同事找到的
foreach( CrystalDecisions.CrystalReports.Engine.Table  tbl in rep.Database.Tables)
{
log = tbl.LogOnInfo;
log.ConnectionInfo = conn;
tbl.ApplyLogOnInfo(log);
//********  注意下面这句!关键
tbl.Location = "your db name" + "." + tbl.Location;
}
就是这个属性,如果你跟踪,它显示的是你的表名,比如叫table1,但实际上,它会在前面加入老DB的名称,这样你取得的就是以前DB的数据,水晶报表是不是很瓜:(

最后,为了不改报表,我们用的是第二种方法。

-------------------
另外,我还想提醒大家一点,如果你是在WEB上用水晶报表,并且要打印或者导出功能(我想,大部分人都需要吧),就不能给报表控件所在的Page以URL的方式传参数。因为水晶报表中打印和导出功能都是通过URL,并且以打开新页面的方式来实现的,而不像其它ASP.NET控件是提交到当前页面的方式实现。

--------------------

#16


忘记说了,为了给水晶报表控件所在页面传参数
我都是把参数写入Session中进行传递的,真是没办法:(

#1


up

#2


up
只能up.自己也很想知道。

#3


up

#4


我这样做没遇到问题:
DataSet thisDataSet = new DataSet();
rptCompact rptComp = new rptCompact();
SqlDataAdapter thisAdapter = new SqlDataAdapter(sqlString,thisConn);
thisAdapter.Fill(thisDataSet,"Compact");
rptComp.Database.Tables[0].SetDataSource(thisDataSet);
rptComp.Database.Tables[0].LogOnInfo.ConnectionInfo.ServerName = strServer;
crystalReportViewer1.ReportSource = rptComp;

#5


你的报表中有没有参数字段啊?如果有的话设置一下ReportViewer的参数字段值!

#6


没有参数。

如果我在设计报表时,在设计器中更改了数据源为Credit2_3,那么取得的数据就是Credit2_3的。但是--我不可能在每次改数据库名字后,为每个报表都重新打开报表,更改一次数据源嘛。

真的要抓狂了

自己UP

#7


目前.NET提供的水晶报表设计并不能满足你的需求。

#8


楼上的,你是在开玩笑吧。

我哭5555555555~~~~~~~~~~~~~~~~~~

#9


我搜索了csdn上所有与“水晶”,“Crystal”相关的帖子,都没有找到我需要的

怎么办嘛5~~~~~~~~~~

#10




不可能连换个DB都不行吧

#11


如果你动态的连接数据库到dataset,你在水晶报表中用到的数据源dataset和你的数据库没有直接的关系,你可以用同一个dataset连接不同的数据库,只要查询出的字段名和类型一样就可以。
我不明白你为什么非要更改数据源(即dataset)。在目前.NET提供的水晶报表设计没有此功能。

#12


TableLogOnInfo logOnInfo = new TableLogOnInfo ();
for(int i=0;i<Rpt.Database.Tables.Count;i++)
{
logOnInfo.ConnectionInfo.ServerName = ServerName;
logOnInfo.ConnectionInfo.DatabaseName = DBName;
logOnInfo.ConnectionInfo.UserID = User;
logOnInfo.ConnectionInfo.Password = Pwd;
Rpt.Database.Tables[i].ApplyLogOnInfo(logOnInfo);
}
试一下这样来改变数据源
楼上说的是PUSH的方法,你也可以考虑一下。但是我觉得如果数据不需要特殊处理的话用PULL方式会更方便!

#13


数据库你不是在web.config中文件配置,需要时在修改就成了,你的程序需要在什么时候作数据库的更换,两个数据库的表结构是一样的吗?

#14


我的问题和楼主是一样的,就像楼上老兄说的
我的两个数据库是一摸一样的
应用程序都能访问 就是一到水晶报表就提示打开行集失败
我都快急死了!救命呀

#15


唉,自己搞定了,CSDN又让我失望了(同时还有水晶报表这个破东东)
不过还是谢谢大家的帮助:)

---------------------------
找出了两种解决方法。
方法一:这是我找出来了:)
不使用水晶报表中的向导连接DB中的TABLE,而是使用命令(Command)方法健报表的SQL。用这种方法后,显示报表时,它就不会再到以前的DB中找数据了。

方法二:这是我同事找到的
foreach( CrystalDecisions.CrystalReports.Engine.Table  tbl in rep.Database.Tables)
{
log = tbl.LogOnInfo;
log.ConnectionInfo = conn;
tbl.ApplyLogOnInfo(log);
//********  注意下面这句!关键
tbl.Location = "your db name" + "." + tbl.Location;
}
就是这个属性,如果你跟踪,它显示的是你的表名,比如叫table1,但实际上,它会在前面加入老DB的名称,这样你取得的就是以前DB的数据,水晶报表是不是很瓜:(

最后,为了不改报表,我们用的是第二种方法。

-------------------
另外,我还想提醒大家一点,如果你是在WEB上用水晶报表,并且要打印或者导出功能(我想,大部分人都需要吧),就不能给报表控件所在的Page以URL的方式传参数。因为水晶报表中打印和导出功能都是通过URL,并且以打开新页面的方式来实现的,而不像其它ASP.NET控件是提交到当前页面的方式实现。

--------------------

#16


忘记说了,为了给水晶报表控件所在页面传参数
我都是把参数写入Session中进行传递的,真是没办法:(