~~~我所遇到的WINFORM下水晶报表问题,UP有分

HappinessBoy 2007-04-27 02:52:28
最近开发遇到水晶报表的问题,查阅了些相关资料,有些虽理解犹欠佳,帖出来希望共勉.亦希望有人解惑.,UP有分.

1.在pull模式下,直接连接数据库,即oledb,水晶报表里的字段是直接从【字段资源管理器】下的【数据库字段】拖过去的,关联的是Products表,Form窗体load时的代码如下,测试通过:
reportDocument1 = new CrystalDecisions.CrystalReports.Engine.ReportDocument();
reportDocument1.Load(@"E:\z7z8\Test1\myTestRpt1.rpt");
#region 解决登陆
//foreach(CrystalDecisions.CrystalReports.Engine.Table tb in reportDocument1.Database.Tables)
//{
//CrystalDecisions.Shared.TableLogOnInfo logininfo=tb.LogOnInfo;
//logininfo.ConnectionInfo.ServerName=@"C47ED435468B448\DONGWEI";
//logininfo.ConnectionInfo.DatabaseName="Northwind";
//logininfo.ConnectionInfo.UserID="sa";
//logininfo.ConnectionInfo.Password="";
//tb.ApplyLogOnInfo(logininfo);
//}
#endregion
crystalReportViewer1.ReportSource=reportDocument1;

我的疑问是:我看教程的时候,讲到必须要验证,也就是我注释的那一段,但是我注释后依然能正常运行.请问这是为什么?

2.在用PUSH模型时,需要自己建立XSD文件,这是一个XML类型的文件,他存储的数据源的结构,此时水晶报表里的字段是通过ADO.NET连接获取的,关联的也是products表,测试通过的代码如下:

SqlConnection conn = new SqlConnection("server=(local)\\dongwei;database=northwind;Trusted_Connection=yes");
conn.Open();
SqlCommand com = new SqlCommand("select * from products",conn);
SqlDataAdapter ada = new SqlDataAdapter(com);
myDataset1 m= new myDataset1();//强类型化数据集
ada.Fill(m,"products");
myReport2 m2 = new myReport2();
m2.SetDataSource(m.Tables[0]);
this.crystalReportViewer1.ReportSource=m2;
this.crystalReportViewer1.RefreshReport();,

我想问的是,我能不能使用类型化数据集,自己生成相关的XML文件,然后进行绑定.我的代码如下:

System.Data.DataSet ds = new System.Data.DataSet();
ds.Tables.Add(myDt);//myDt是我用来封装数据的dataTable,此时里面已经存在数据
ds.WriteXml("myDt.Xml",System.Data.XmlWriteMode.WriteSchema);
myRpt3.SetDataSource("myDt.Xml");//水晶报表里没有拖入字段
this.crystalReportViewer1.ReportSource=myRpt3;
this.crystalReportViewer1.RefreshReport();

如果可以使用弱类型化数据集,我上面的这段代码应该如何更改,谢谢~~~
...全文
657 47 打赏 收藏 转发到动态 举报
写回复
用AI写文章
47 条回复
切换为时间正序
请发表友善的回复…
发表回复
ren_001abc 2007-06-03
  • 打赏
  • 举报
回复
万里长城永不倒.孟子不来,此帖不落.
HappinessBoy 2007-04-30
  • 打赏
  • 举报
回复
请问各位,分到没有啊?
HappinessBoy 2007-04-30
  • 打赏
  • 举报
回复
我帖子已经结了,可是却看不到给的分,怎么回事啊?
HappinessBoy 2007-04-30
  • 打赏
  • 举报
回复
@forgot(忘记forgot2000)

十分感谢.
forgot 2007-04-29
  • 打赏
  • 举报
回复
就我现在的情况来说.我设计报表的时候是通过oledb连接的而拖放的字段,但是在代码的实现我是通过.net来拉数据的,然后推给报表,那么就是push 模式.跟设计无关,只关乎水晶报表的数据是怎么得到的?

没错,你可以用oledb连接数据来设计报表,然后用ADO.NET的代码来提取数据,那么实际报表数据就是通过Push模式得到的,好比说,你换了连接一个xml文件或者Access文件(同样的数据表字段)来设计这份报表,如果你是使用Push模式取数的话.最后结果是一样的,没有任何区别.施动者意思就是"发出提取数据行为的动作者".我搞不懂这么简单的概念你怎么会混淆?也搞不懂为什么这么多人都没有解释清楚.
guoxingdong504 2007-04-29
  • 打赏
  • 举报
回复
我的做法是:
1 建立一个xsd文件里建一个datatable,列由自己输入,
2 建立一个.rpt文件,数据源定为datatable
3 通过代码向datatable里传数据,
while(ds.read())
{
xsd1.datatable1.rows.add(new object[] {ds[0].tostring(),ds[1].tostring()....});
}
HappinessBoy 2007-04-29
  • 打赏
  • 举报
回复
我没弄懂我的问题.你叫我如何结,叫我怎么结..哎.~~~~
QuinsonYue 2007-04-29
  • 打赏
  • 举报
回复
捣腾了这么久都没有结帖,真搞不懂CSDN是怎么回事
呵呵
HappinessBoy 2007-04-29
  • 打赏
  • 举报
回复
@forgot(忘记forgot2000)

什么是施动者,水晶报表吗?第一次接触这个概念.
HappinessBoy 2007-04-29
  • 打赏
  • 举报
回复
@forgot(忘记forgot2000)

你这么一说.我有些明白了.
就我现在的情况来说.我设计报表的时候是通过oledb连接的而拖放的字段,但是在代码的实现我是通过.net来拉数据的,然后推给报表,那么就是push 模式.跟设计无关,只关乎水晶报表的数据是怎么得到的?
forgot 2007-04-29
  • 打赏
  • 举报
回复
拉模式和推模式跟施动者相关,而哪种连接方式跟驱动相关,前后根本没有任何关系.就是说不管是拉模式还是推模式,根本区别在于是哪个施动者去提取数据的,跟你用ADO.net连还是OLEDB连,甚至其他方式连都没有任何关系.
forgot 2007-04-29
  • 打赏
  • 举报
回复
你还是没有真正地理解.不管你是用什么连接,你最后都会有一张报表出现,对吗?好了,如果你的.NET程序没有写任何跟数据连接的代码,水晶报表也可以出来(可能是空报表也可能是有数据的),如果是有数据的,那这些数据就是水晶报表自己拉回来的.那么就是"拉"模式.好了,不管你的水晶报表怎么设计(不管ADO.net还是oledb),你的.net代码里面有数据连接代码,并且最好生成的DataSet你赋给了水晶报表,那么水晶报表就会优先使用你的代码提取到的数据(而不管水晶报表本身设计时候是怎么连接数据库的),这就是"推"模式.
HappinessBoy 2007-04-29
  • 打赏
  • 举报
回复
@guoxingdong504(东帝)

那rpt里的列字段你是怎么拖的呢?
HappinessBoy 2007-04-29
  • 打赏
  • 举报
回复
@ forgot(忘记forgot2000)

第二个问题:看来你没有理解清楚Push和Pull模式的区别.myRpt3.SetDataSource("myDt.Xml");//水晶报表里没有拖入字段,水晶报表如果没有拖入字段,不管你用哪种模式,都是看不到任何东西的.水晶报表没有动态绑定数据出现数据列的功能,【所有的列都是要求你设计的时候拖放在上面的.】--------那关乎我是通过oledb还是ado.net连接后拖的吗?
HappinessBoy 2007-04-29
  • 打赏
  • 举报
回复
@ forgot(忘记forgot2000)

谢谢噶..算是解惑了.
forgot 2007-04-29
  • 打赏
  • 举报
回复
捣腾了这么久都没有结帖,真搞不懂CSDN是怎么回事,标准答案来了:
第一个问题:水晶报表可以预存数据,你使用Pull模式直接拉了数据保存报表时候已经连数据一起保存了,你把代码注释掉之后,你打开报表看到的是连数据一起保存之后的报表,你不妨改一下数据库里的数据,会看到报表还是没变,因为报表根本就没有连上数据库,显示给你看的是当时保存的旧数据.解决办法:用水晶报表独立版本(非.NET自带的设计器),取消"文件"菜单下的"将数据与报表一起保存"的选项,重新保存报表,再打开网页的时候你会发现登录窗口又出现了.
第二个问题:看来你没有理解清楚Push和Pull模式的区别.myRpt3.SetDataSource("myDt.Xml");//水晶报表里没有拖入字段,水晶报表如果没有拖入字段,不管你用哪种模式,都是看不到任何东西的.水晶报表没有动态绑定数据出现数据列的功能,所有的列都是要求你设计的时候拖放在上面的.
像你的这段代码,你用的就是Push模式,Pull和Push模式的区别在于:
Pull模式是指水晶报表主动去把数据"拉"回来,数据跟.NET没有关系,水晶报表主动接收数据.
Push模式是指.NET把数据先"拉"回来,然后推给水晶报表,水晶报表被动接收数据

两个模式区别在于,前者是水晶报表拉数据回来,后者是.NET拉数据回来,然后推给水晶报表.你的代码中
SqlConnection conn = new SqlConnection("server=(local)\\dongwei;database=northwind;Trusted_Connection=yes");
conn.Open();
SqlCommand com = new SqlCommand("select * from products",conn);
SqlDataAdapter ada = new SqlDataAdapter(com);
myDataset1 m= new myDataset1();//强类型化数据集
ada.Fill(m,"products");
myReport2 m2 = new myReport2();
m2.SetDataSource(m.Tables[0]);

就是表明拉数据是由.NET代码完成的.所以属于推模式
HappinessBoy 2007-04-28
  • 打赏
  • 举报
回复
沉了..
HappinessBoy 2007-04-27
  • 打赏
  • 举报
回复
【针对原文第2个问题的补充:】
是不是push模式必须要有对应了表结构的强类型化数据集,自己构造的dataTable可以吗?
HappinessBoy 2007-04-27
  • 打赏
  • 举报
回复
【针对原文第1个问题的发现:】
通过oledb直接连接数据库后,我从"字段资源管理器"里直接把需要的字段拖到了水晶报表里去,因为我有已经填充了数据的dataTable,于是我在晶报表查看器里就直接绑定了.代码如下:
this.crystalReportViewer1.ReportSource=target_dt;//我自己的datatable
this.crystalReportViewer1.RefreshReport();
运行后正确显示.弄的自己都挺疑惑了.不知道自己究竟是在执行pull还是push.两种模式根本上的区别究竟是什么啊?
yanhao0708 2007-04-27
  • 打赏
  • 举报
回复
up
加载更多回复(25)

4,819

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 图表区
社区管理员
  • 图表区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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