今天真的很兴奋,折磨了我很久的问题终于解决了,现在吧我这阶段遇到的问题总结出来和大家分享一下,希望能给遇到同样问题的你或者你们一点建议。我还是个水晶报表新手,以后在做水晶报表过程中可能还会遇到很多问题,也需要大家的帮助,希欢迎大家提出意见,指导我进行改进。欢迎大家勇于探讨。也希望以后的学习过程中能够得到大家的帮助(附代码)。
在这里我想我最应该感谢的是阿泰哥,千里马(远程协助,我很幸运吧),龅牙鱼/抠鼻(远程协助,我很幸运吧),还有就是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();
}
}
这里就结束了,希望对需要帮助的人有点帮助,也希望大家提出意见,我会认真的听取并进行改进(我会用图片的时候会把图片也放上去的)!这里我还担心一个问题那就是:这样数据查询两次会不会影响速度啊?欢迎大家给点意见!非常感谢大家阅读我的文章!