li.ConnectionInfo = ci;
中的ci不会是个默认的吧

解决方案 »

  1.   

    自己解决了,贴出来可能以会有人会用到
    /// <summary>
    /// 子报表连接数据库方法 此方法将对有子报表的报表有效 
    /// 方法 ConnectDataBase 将调用此方法 crReportDocument 为主报表对象,已定义
    /// Add BY CDK 2004-10-20
    /// </summary>
    /// <param name="server">服务器名称</param>
    /// <param name="database">数据库名称</param>
    /// <param name="user_id">登录用户ID</param>
    /// <param name="password">登录密码</param>
    private void SubRptConnectDB(string server, string database, string user_id, string password)
    {
    ConnectionInfo ci = new ConnectionInfo();
            
    ci.ServerName = server;
    ci.DatabaseName = database;
    ci.UserID = user_id;
    ci.Password = password;

    SubreportObject subObj;
    ReportDocument subRpt; //获取主报表的所有子对句
    foreach (ReportObject obj in crReportDocument.ReportDefinition.ReportObjects)
    {
    //判断是否为子报表对象
    if (obj.Kind == ReportObjectKind.SubreportObject)   
    {
    subObj = (SubreportObject) obj;
    subRpt = crReportDocument.OpenSubreport(subObj.SubreportName); TableLogOnInfo li = new TableLogOnInfo(); //读取子报表的所有数据库表
    foreach (CrystalDecisions.CrystalReports.Engine.Table tbl in subRpt.Database.Tables)
    {
    li = tbl.LogOnInfo;
    li.ConnectionInfo = ci; //加载数据库连接信息
    tbl.ApplyLogOnInfo(li);

    //重新写向数据库表的位置 (关键代码)
    tbl.Location = tbl.Location.Substring(tbl.Location.LastIndexOf(".") + 1);
    tbl.Location = database + ".dbo." + tbl.Location;

    //tbl.TestConnectivity(); //测试数据库连接 (暂不用)
    }
    }
    }
    }