水晶报表多表查询问题

来源:互联网 发布:网络授权委托书 编辑:程序博客网 时间:2024/05/21 06:37

今天真的很兴奋,折磨了我很久的问题终于解决了,现在吧我这阶段遇到的问题总结出来和大家分享一下,希望能给遇到同样问题的你或者你们一点建议。我还是个水晶报表新手,以后在做水晶报表过程中可能还会遇到很多问题,也需要大家的帮助,希欢迎大家提出意见,指导我进行改进。欢迎大家勇于探讨。也希望以后的学习过程中能够得到大家的帮助(附代码)。

  在这里我想我最应该感谢的是阿泰哥,千里马(远程协助,我很幸运吧),龅牙鱼/抠鼻(远程协助,我很幸运吧),还有就是csdn中回答我问题的朋友llsen,真的很感谢你们。在这里说声谢谢了!

  我的学习过程是按照阿泰的资料来学习的,谢谢你了!首先说说我的项目条件:VS2005+自带的水晶报表,+Oracle数据库。我做的这个报表需要输入用户的查询条件,然后根据查询条件将查询结果再报表中显示,期间我在做的过程中遇到了一个新手都应该会遇到的问题,就是数据库登陆框的部分,(csdn里怎么添加图啊)。我不会在这里加图,有知道怎么加的话告诉我,我以后改进的过程中加上。哈哈!问题大概是这样:

  您请求的报表需要更多信息.

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

  DataSet1 

  服务器名:   

  数据库名:   

  用户名:   

  密码:   

  使用集成安全性 

  其实我用的是PUSH方法,不应该会出现这样的情况的,可是的却出现了,后来我吧CrystalReportViewer1的EnableDatabaseLogonPrompt属性改成"False",却又提示我:

登录失败。详细资料: crdb_adoplus : 未将对象引用设置到对象的实例。文件 C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/WTJ {D897BB81-C679-48CB-9DDF-E9840AE70243}.rpt 内出错:无法连接:错误的登录参数。

  我百思不得其解,就在网上发贴问问,http://topic.csdn.net/u/20091113/09/bf0c156b-322f-4e29-b99e-387259bbaf8b.html。(帖子网址),其实这种问题问题很多新手都会遇到,后来在看阿泰的文章(http://topic.csdn.net/u/20090626/18/0e7d0af0-2555-479d-9cb5-84175787f2cd.html?17240)的时候看到出现这种情况的两种原因:

  a:如果是多表的话,可能是部分表没有赋值。

  水晶报表需要对用到的每个表进行验证,即使没数据。没有的话,传个空的记录集也行。

  b:代码没有放到Page_Load或Page_init里,或者是放到了,但是控制了 postback。

  我就想我的代码没有放在 Page_Load里,于是我按照这个想法在里面写上了代码:

string constring = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ToString();
 Session["ConnectionString"] = constring;
  OracleConnection conn = new OracleConnection(constring);
  conn.Open();
 string reportPath = System.Threading.Thread.GetDomain().BaseDirectory + "报表名字.rpt";
  myReport.Load(reportPath);
 DataTable table = new DataTable();
  myReport.SetDataSource(table);

  别忘记这句哦: ReportDocument myReport = new ReportDocument();

  总结之所以出现上面的情况就是因为加载的时候报表没有值,而出现的,所以报表在加载的时候不惜赋初值,即使是个空置也可以,我这里就给其赋看NULL值,就不会出现那种情况了。(不知道理解的对不对,请高手指点)。

这里要注意,要在web.config中加上这样语句:

<connectionStrings>
    <add name="ConnectionString" connectionString="Data Source=数据库名字;User ID=用户名;Password=密码;Unicode=True"   providerName="System.Data.OracleClient" />
  </connectionStrings>

  后来我运行过程中不再出现那样的问题,但是接着又出现一个问题,那就是在查询数据的时候,只显示第一页的数据,点击下一页的时候就会出现空白,这个问题又折磨了我很久(很惨吧)。我跟踪数据的时候发现查询出来的数据是对的,为何会出现这样的情况呢。后来我仔细想想,这个还是有可能和那个加载初始化有关吗,我就想,我点击下一页的时候会不会下一页显示的数据是初始化里的数据呢?我给的是空值啊!我就在Page_Load里加上具体的查询语句,然后在运行,果不其然,下一页的数据真的是初始化时候查询的数据(不要以为你的数据就是一页哦!)。那么怎么才能让查询的第二页数据显示出来呢?那就是吧查询的条件放在Page_Load里,这样做可行吗?我尝试了一下,真的可以,到现在问题解决了。真的很兴奋。下面是我的程序的完整代码,希望给新手有点帮助,也请大家提出点意见,以便改进。感谢提出意见的朋友了!

  代码:

public partial class YSJGJQKB : System.Web.UI.Page
{
    ReportDocument myReport = new ReportDocument();
    CrystalReportSource cr = new CrystalReportSource();
    protected void Page_Load(object sender, EventArgs e)
    {
         string selectdw1, selectdate1;
        selectdw1 = selectdw.Value.Trim();        CrystalReportViewer1.ReportSource = myReport;
        selectdate1 = selectdate.Value.Trim();      
        //定义两个数据表
        DataTable dt1 = new DataTable();
        DataTable dtx = new DataTable();
        //选择数据
        string strSel = "写上你的查询条件";
        OracleDataAdapter da = new OracleDataAdapter(strSel, conn);
        da.Fill(dt1);
        covertdata covDt = new covertdata();(这里是一个转换的函数)
        dtx = covDt.dtx(dt1);
        string reportPath = System.Threading.Thread.GetDomain().BaseDirectory + "WTJ.rpt";(换成你的加载报表的报表名字)
        myReport.Load(reportPath);
         CrystalReportSource1.ReportDocument.SetDataSource(dtx);
    }
    protected void button1_Click(object sender, EventArgs e)
    {
       string selectdw1, selectdate1;
        selectdw1 = selectdw.Value.Trim();
        selectdate1 = selectdate.Value.Trim();      
        //定义两个数据表
        DataTable dt1 = new DataTable();
        DataTable dtx = new DataTable(); 
        //选择数据
        string strSel = "写上你的查询条件";
        OracleDataAdapter da = new OracleDataAdapter(strSel, conn);
        da.Fill(dt1);
        covertdata covDt = new covertdata();(这里是一个转换的函数)
        dtx = covDt.dtx(dt1);
        string reportPath = System.Threading.Thread.GetDomain().BaseDirectory + "WTJ.rpt";(换成你的加载报表的报表名字)
        myReport.Load(reportPath);
         CrystalReportSource1.ReportDocument.SetDataSource(dtx);
        CrystalReportSource1.DataBind();
        CrystalReportViewer1.ReportSource = myReport;
        CrystalReportViewer1.DataBind();

    }
}

 

  这里就结束了,希望对需要帮助的人有点帮助,也希望大家提出意见,我会认真的听取并进行改进(我会用图片的时候会把图片也放上去的)!这里我还担心一个问题那就是:这样数据查询两次会不会影响速度啊?欢迎大家给点意见!非常感谢大家阅读我的文章!

原创粉丝点击