更改水晶报表的登录方式:
his.logOnInfo =  rpt.Database.Tables[0].LogOnInfo;
this.logOnInfo.ConnectionInfo.ServerName = this.textBox1.Text;
this.logOnInfo.ConnectionInfo.DatabaseName = this.textBox2.Text;
this.logOnInfo.ConnectionInfo.UserID = this.textBox3.Text;
this.logOnInfo.ConnectionInfo.Password = this.textBox4.Text;发现以下的问题:
1.SqlServer数据库,数据库名相同,但Server不同,在改ServerName的时候可以。但当Server不变,改变Database,其取的资料却是原设计时连接的数据库.
2.Oracle数据库:ServerName相同,更改UserId,登录可以通过,但在导出或预览是提示查询失败。另外当第一次设为设计时指定的UserId,预览通过,然后再改为另一个UserId,没反应。当第一次就改为不是设计时用的UserId,提示查询失败后,再改为设计时的UserId,按道理我给它纠正回去了嘛,可仍然提示查询失败.这是不是Crystal Report的Bug?. 我用的是10版本。当然还有别的一些问题,暂时提出两个最明显的问题出来。
在网上查过资料,几乎都是ConnectionInfo而已。网上还有一篇什么彻底解决水晶报表登录的贴子,没提到上面的问题。

解决方案 »

  1.   

    1。试试下面这段代码:
    public void LoadReport(CrystalDecisions.CrystalReports.Engine.ReportClass rpt)
    {
    TableLogOnInfo info=new TableLogOnInfo();
    foreach(CrystalDecisions.CrystalReports.Engine.Table tab in rpt.Database.Tables)
    {
    info=tab.LogOnInfo;
    info.ConnectionInfo.ServerName=textBox1.Text;
    info.ConnectionInfo.UserID=textBox3.Text;
    info.ConnectionInfo.Password=textBox4.Text;
    info.ConnectionInfo.DatabaseName=textBox2.Text;
    tab.ApplyLogOnInfo(info);
    }
    ReportViewForm f=new ReportViewForm();
    f.crystalReportViewer.ReportSource=rpt;
    f.crystalReportViewer.RefreshReport();
    f.ShowDialog();
    }
    2。就是这样:建立一个DataSet A,连接到数据库,将需要的表导入到DataSet中。然后再建一个DataSet B,在这个数据集中建立报表所用到的表结构,并将它们拖动水晶报表上,也就是绑定到报表中,最后将A合并到B中,B.Merge(A); 然后设计水晶报表的数据源:先new一个水晶报表实例rpt,再设置数据源:rpt.SetDataSource(B), 最后设置水晶报表控制器的数据源:
    rptview1.ReportSource = rpt。   这样不用水晶报表去连接数据库了,而是由Ado.net去连。呵呵。
      

  2.   

    To:kkk_visual(不学无术) 
    多谢回复,我说了我知道你说的方法。我本来就是那样写的。现在解决了SqlServer数据库的改变登录的问题,打了Crystal Report SP1,它居然有这样的bug出来狂晕
    现在打了Sp4也还有Oracle的问题。进一步观察中Crystal Report11啊,没有呢,10的才开始用Oracle改变登录的提示信息:
    “查询引擎错误:'执行 SQL 语句失败。OCI 调用: OCIStmtExecute' \r查询引擎错误:'ORA-00942: 表或视图不存在”
      

  3.   

    没有人做过改变水晶报表的Oracle数据库登录吗?