老大们:
    我要动态的将数据源赋给报表(通过数据集xsd文件)
代码如下:
string myConnectionString = "..."
SqlConnection myConnection = new SqlConnection(myConnectionString);
string mySelectQuery = "select * from A_CK";
SqlDataAdapter myDataAdapter = new SqlDataAdapter(mySelectQuery, myConnection);
//DataSet1为用XML 架构定义语言 (XSD) 描述的DataSet架构
Dataset1 dsBill = new Dataset1();
// 连接到数据库、从数据库中获取数据然后断开数据库连接
myDataAdapter.Fill(dsBill,"A_Ck");
//实例化水晶报表
CrystalReport3 CR_Bill = new CrystalReport3();
//登录信息
CrystalDecisions.Shared.TableLogOnInfos myTableLogonInfos = 
new TableLogOnInfos();
CrystalDecisions.Shared.TableLogOnInfo myTableLogonInfo = 
new TableLogOnInfo();
CrystalDecisions.Shared.ConnectionInfo myConnectionInfo =
new ConnectionInfo();
myConnectionInfo.ServerName = "...";
myConnectionInfo.DatabaseName = "...";
myConnectionInfo.UserID = "...";
myConnectionInfo.Password = "...";

myTableLogonInfo.ConnectionInfo = myConnectionInfo;
myTableLogonInfo.TableName = "A_CK";
myTableLogonInfos.Add(myTableLogonInfo);
this.crystalReportViewer1.LogOnInfo = myTableLogonInfos; //将填充的数据集传递给报表
CR_Bill.SetDataSource(dsBill); //设置报表源,将该报表对象绑定到 Web 窗体查看器
crystalReportViewer1.ReportSource=CR_Bill;
crystalReportViewer1.RefreshReport();问题在于,dsBill确实被填充了,其中有个叫A_CK的表,也有数据,但CR_Bill.SetDataSource(dsBill);执行之后,在CR_Bill中的dataBase.Tables.Count竟为0,报表的数据源没有表,当然也没有数据,(此时dsBill中仍有数据表)就好像CR_Bill.SetDataSource(dsBill);没起作用。本来要用存储过程的,但连表都无法实现
各位老大帮帮忙吧,救急!!!!!!!!!!!!!!!!!!

解决方案 »

  1.   

    说说我的做法DS = null;
    DS = new System.Data.DataSet();m_strSQL = "";
    m_strSQL = m_strSQL + "SELECT CustomerID as CustomerID, CustomerName, Sex, CustomerSpell, Trade, BalanceIntegral, CardNo, SortName, Address, Phone, IdentityID, Email AS Email, CardID as CardID";
    m_strSQL = m_strSQL + "  FROM T_Customer";
    m_strSQL = m_strSQL + "  WHERE (((IsUse)>=0))";
    if(this.txtCustomerName.Text.Trim().Length > 0)
    {
    m_strSQL = m_strSQL + "  And CustomerName like '%" + this.txtCustomerName.Text.Trim() + "%'";
    }
    if(this.txtTrade.Text.Trim().Length > 0)
    {
    m_strSQL = m_strSQL + "  And Trade like '%" + this.txtTrade.Text.Trim() + "%'";
    }
    if(this.txtCardNumber.Text.Trim().Length > 0)
    {
    m_strSQL = m_strSQL + "  And CardNo like '%" + this.txtCardNumber.Text.Trim() + "%'";
    }
    m_strSQL = m_strSQL + "  ORDER BY CustomerSpell";ClassGlobe.conn.Open();
    System.Data.OleDb.OleDbDataAdapter adapter  = new System.Data.OleDb.OleDbDataAdapter(m_strSQL, ClassGlobe.conn);
    adapter.Fill(DS, "T_Customer");
    ClassGlobe.conn.Close();//DS.WriteXml(@"d:\AutoClubCustomer.xml", System.Data.XmlWriteMode.WriteSchema);rpt = null;
    rpt = new rptQueryCustomer();
    rpt.SetDataSource(DS);this.crvQueryCustomer.ReportSource = rpt;首先,把//DS.WriteXml(@"d:\AutoClubCustomer.xml", System.Data.XmlWriteMode.WriteSchema);
    的注释去掉。
    同时把
    rpt = null;
    rpt = new rptQueryCustomer();
    rpt.SetDataSource(DS);this.crvQueryCustomer.ReportSource = rpt;注释起来,
    然后运行一遍这些代码,你就会获得一个XML文件“d:\AutoClubCustomer.xml”现在就可以新建一个空白报表了。假如取名为“rptQueryCustomer”
    然后,添加/删除数据库,然后选择“更多数据源”--〉ADO.NET(XML),然后选择d:\AutoClubCustomer.xml,然后就有字段了,直接在报表上排列即可。
      

  2.   

    to:scocsdn(发菜) ( ) 
       去掉也不对。
    to:cnming(cnming) ( )
       我想动态的在程序里指定,因为要打印的报表很多,不可能每一个都用一个连好表的rpt文件吧。老大们,再帮帮忙啊!《》
      

  3.   

    ,最近也在想这个问题,有一种动态指定的方法,但也不是完全的动态,量先指定了字段,程序在以后动态指定记录集.
    http://www.cnblogs.com/babyt/archive/2005/05/12/116878.html#154005有无更好的方法?即能完全动态指定!!!包括字段定义.象在excel中一样
      

  4.   

    那我提到的问题中,是不是还应先在报表中加入字段?如果这样的话,CR_Bill.SetDataSource(dsBill);根本就谈不上什么动态了。而且我发现,水晶报表有的数据库类型不支持(如uniqueidentifier),那原来的存储过程还得重写一套,有没有其他得方法?
    我目前能想到的是从Dataset.xsd先过渡一下,这样就会自动转换成水晶报表能够识别得类型,再用CR_Bill.SetDataSource(dsBill);实现动态赋值。如果还是要先在报表中指定字段(存储过程)的话,水晶报表将会报错(不支持类型等)。有人解决了吗? 不胜感激
      

  5.   

    使用Pull模式 
      我们将通过下面的这些步骤来通过Pull模式来执行水晶报表 
      1.首先创建rpt文件,并使用水晶报表设计接口设置一些必须的数据连接。 
      2.拖放一个 CrystalReportViewer控件至aspx页面,设置它的属性指定我们上一步创建的.rpt文件。 
      3. 在代码中调用DataBind方法。
      创建 .rpt 文件:
      1) 在右击”解决方案游览器“,在弹出的菜单中选择”添加“--”添加新项“-->”Crystal Report”  
     
      2) 在”Crystal Report 库”中选择”作为空白报表“单选按钮,最后单击“确定“。  
     
      3)这里将弹出水晶报表设计器。  
     
      4) 右击报表中的”详细资料区”,选择“数据库”->“添加/删除数据库..."
      5) 在弹出的”数据库专家“中,扩展”OLE DB(ADO)“选项,此时会弹出另外一个”OLE DB(ADO)“窗口。
      6) 在 "OLE DB (ADO)" 弹出窗口中,选择 "Microsoft OLE DB Provider for SQL Server" 然后 "Next"
     
      7) 指定连接的信息
      服务器 : ASPCN (您的机器是什么名字就写什么) 
      用户 ID: sa
      密码:
      数据库 : Pubs
      8) 单击”Next“,最后单击”Finish“按钮。
      9) 这时你就能在”数据库专家“窗口中看到我们选择的数据库。
      10) 扩展”Pubs“数据库,扩展”表“,选择”Stores“表并将其加到”选定的表“区中,单击”OK"按钮。
       
      11) 现在在”字段资源浏览器“中就会在左边”数据库字段“区中显示你选择的表,以及表中的字段。
      12) 拖放需要的字段进入报表的”详细资料“区。字段名将会自动出现在”页眉“区。如果你想修改头部文字,则可以右击”页眉“区中的文字,选择”编辑文本对象“选项并进行编辑。
     
      13) 保存,这样我们就有了一个水晶报表文件。
      创建 CrystalReportViewer 控件
      14) 回到前面的WebForm中,拖放一个Crystal Report Viewer控件到页面中去。
      15) 调出Crystal Report Viewer控件的属性窗口,选择“DataBindings"区点击[...]
      16) ”Crystal Report Viewer 数据绑定窗口”中,在右边的“可绑定属性”中选择”ReportSource“,并选择右下角的“自定义绑定表达式”中指定.rpt文件路径。  
     
      17) 此时你能够从Crystal Report Viewer 控件中看到使用一些虚拟数据组成的报表文件的预览。
      注意:在上面的例子中,CrystalReportViewer可以在设计时直接调用真实的数据,因为此时数据已经保存。在这种情况下,设计时当没有保存数据时,他是不能显示数据的。取而代这的是显示一些虚拟的数据,只有在执行时才会选取真实的数据。
      Code Behind 程序设计
      18) 在Page_Load方法中调用DataBind方法。
      执行你的程序 
      19) 创建并运行你的程序!  
      您现在就可以直接在Web页面中使用水晶报表内置的一些功能,如页面导航,缩放等。
      

  6.   

    谢谢,CSDNATM(青蛙【自娱自乐】) ( )
    但好像所答非所问,是否可以脱离事先赋字段值?
      

  7.   

    >>我想动态的在程序里指定,因为要打印的报表很多,不可能每一个都用一个连好表的rpt文件吧。
    不明白什么叫着“打印的报表很多”,每种报表你总是都要做嘛,比如客户名单报表,客户记录报表,这总是要做两份报表的嘛,难道你想就做一个?
    此外,制定XML仅仅是指定数据结构而已,最终都是由rpt.SetDataSource(DS);中的DS把数据导入报表的,代码都写得那么详细了,为何不试试看?
      

  8.   

    谢谢,cnming(cnming) ( )
    你的方法没问题,我的问题基本解决了。
    我还想问一下,怎样将两个分别计算的DataSet放到一个DataSet中,即将两个dataset中的表放到一个中,再用报表的setdataSouce()方法。
      

  9.   

    怎样将两个分别计算的DataSet放到一个DataSet中,即将两个dataset中的表放到一个中DataSet 可以容纳很多个Table的,所以可以放到一起