0

我创建了显示我的报告的方法,然后我在运行时提供了连接信息,但是当我连接到远程服务器时出现错误

 public bool ShowReport()
{
    try
    {
        //CrystalDecisions.CrystalReports.Engine.ReportDocument oRepDoc;
        //CrystalDecisions.Shared.TableLogOnInfo oLogInfo;
        //CrystalDecisions.CrystalReports.Engine.Table oTable;
        //CrystalDecisions.CrystalReports.Engine.FieldDefinition oField;
        //CrystalDecisions.CrystalReports.Engine.ParameterFieldDefinition oParamFieldDef;
        //CrystalDecisions.Shared.ParameterValues oParamValues;
        //CrystalDecisions.Shared.ParameterDiscreteValue oDiscretParamValue;
        //ParameterFields oParamList;
        //ParameterField oParamItem;

        if (!System.IO.File.Exists(ReportPath))
        {
            MessageBox.Show("ملف التقرير غير موجود فى المسار الصحيح", MainClass.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Warning);
            return false;
        }
        else
        {
            oRepDoc = new ReportDocument();
            oLogInfo = new TableLogOnInfo();
            Tables t;
            oRepDoc.Load(ReportPath, OpenReportMethod.OpenReportByTempCopy);
            //***********************************************************************************

            ConnectionInfo connection = new ConnectionInfo();
            if (MainClass.IntegratedSecurity) connection.IntegratedSecurity = true;
            else
            {

                connection.IntegratedSecurity = false;
                connection.UserID = MainClass.UserId;
                connection.Password = MainClass.Password;
            }
            connection.ServerName = MainClass.ServerName;
            connection.DatabaseName = MainClass.DatabaseName;
             t= oRepDoc.Database.Tables;
             foreach (CrystalDecisions.CrystalReports.Engine.Table oTab in t)
            {
                oLogInfo = oTab.LogOnInfo;
                oLogInfo.ConnectionInfo = connection;

                oTab.ApplyLogOnInfo(oLogInfo);

                //oLogInfo = null;
            }

            //***********************************************************************************

            oRepDoc.Refresh();
            oRepDoc.VerifyDatabase(); // Very Important Line
            //***********************************************************************************
            // First Way To Pass Report Parameters Value
            foreach (Range oRange in oRangeList)
            {
                oRepDoc.SetParameterValue(oRange.RangeName, oRange.RangeValue);
            }
            oRangeList.Clear();
            //***********************************************************************************
            // Second Way To Pass Report Parameters Value
            //ParameterValues oCurrentParameterValues;
            //ParameterDiscreteValue oParameterDiscreteValue;
            //CrystalDecisions.CrystalReports.Engine.ParameterFieldDefinitions oParameterFieldDefinitions = oRepDoc.DataDefinition.ParameterFields;
            //foreach (Range oRange in oRangeList)
            //{
            //    oCurrentParameterValues = new ParameterValues();
            //    oParameterDiscreteValue = new ParameterDiscreteValue();
            //    oParameterDiscreteValue.Value = oRange.RangeValue;
            //    oCurrentParameterValues.Add(oParameterDiscreteValue);
            //    ParameterFieldDefinition oParameterFieldDefinition = oParameterFieldDefinitions[oRange.RangeName];
            //    oParameterFieldDefinition.ApplyCurrentValues(oCurrentParameterValues);
            //}
            //oRangeList.Clear();
            //***********************************************************************************
            // Pass "Company Name" And "Telephone" And "Printed By"  To Report
            FormulaFieldDefinition oFormulaFieldDefinition;
            FormulaFieldDefinitions oFormulaFieldDefinitions = oRepDoc.DataDefinition.FormulaFields;

            oFormulaFieldDefinition = oFormulaFieldDefinitions["For_CompanyName"];
            oFormulaFieldDefinition.Text = string.Format("\"{0}\"", MainClass.CompanyName);
            oFormulaFieldDefinition = oFormulaFieldDefinitions["For_CompanyTel"];
            oFormulaFieldDefinition.Text = string.Format("\"{0}\"", MainClass.CompanyTel);
            oFormulaFieldDefinition = oFormulaFieldDefinitions["For_PrintedBy"];
            oFormulaFieldDefinition.Text = string.Format("\"{0}\"", MainClass.GetUserName(MainClass.SystemUserId));
            //***********************************************************************************
        }
        if (Destination == ReportDestination.Printer)
        {
            oRepDoc.PrintOptions.PrinterName = PrinterName;
            oRepDoc.PrintToPrinter(NumberofCopies, Collate, StartPage, EndPage);
            return true;
        }
        return true;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, MainClass.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Warning);
        return false;
    }
}

调试 oRepDoc.VerifyDatabase() 时;通过 connectioninfo 在 sql server 上的工作方式,我得到错误无效映射

4

2 回答 2

0

确保您的 UserId 和密码在 MainClass 中正确,数据库不需要加密密码或您正在传递加密值,并且用户有权访问该数据库。

于 2012-04-30T15:46:19.777 回答
0

来自 MSDN 上的这个帖子的 Tim Vasil 说,他通过在正在连接的服务器计算机上安装 Microsoft SQL Server Native Client 解决了这个错误。

http://social.msdn.microsoft.com/forums/en-US/vscrystalreports/thread/3c8db743-f1fb-4021-bf46-f6aee8889932

以下是有关如何安装 Microsoft SQL Server Native Client 的一些链接:

http://msdn.microsoft.com/en-us/library/ms131321.aspx

http://msdn.microsoft.com/en-us/sqlserver/ff658532

于 2012-05-02T17:57:57.620 回答