1

我在我的网站中使用 PrintToPrinter(1,false,1,1) 获取水晶报告。单击此按钮(btnPrintToPrinter)后,它会抛出 LogOnException 并说 Database Logon failed :

protected void btnPrintToPrinter_Click(object sender, EventArgs e)
{
    int empno = Convert.ToInt32(Session["AnyVal"]);

    SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);



    string strQuery = "SELECT [View_EmplDetail].[Uni-Code], [View_EmplDetail].[FacultyCode], [View_EmplDetail].[EmpIDstr], [View_EmplDetail].[EngGivenName], [View_EmplDetail].[position_eng], [View_EmplDetail].[Emp_no], [View_EmplDetail].[GivenName], [View_EmplDetail].[position_name], [View_EmplDetail].[DariName], [Tbl_Dept].[EName], [View_EmplDetail].[photo] FROM   [MoHEDatabase].[dbo].[View_EmplDetail] [View_EmplDetail] INNER JOIN [MoHEDatabase].[dbo].[Tbl_Dept] [Tbl_Dept] ON [View_EmplDetail].[DepCode]=[Tbl_Dept].[DepCode] WHERE  [Emp_no] = @empno";
    SqlCommand command = new SqlCommand(strQuery, connection);
    command.CommandType = System.Data.CommandType.Text;

    command.Parameters.AddWithValue("@empno", empno);
    command.Connection = connection;
    command.Connection.Open();

    SqlDataAdapter da = new SqlDataAdapter(command);
    DataTable dt = new DataTable();
    da.Fill(dt);

    ReportDocument rpt = new ReportDocument();
    string _reportPath = Server.MapPath("..\\Student\\cardFinal.rpt");
    //rpt.Load(AppDomain.CurrentDomain.BaseDirectory + "\\" + @"\\Student\\CardFinal.rpt");
    rpt.Load(_reportPath);

    rpt.SetDataSource(dt);
    emp_card_report_viewer.ReportSource = rpt;

    string sq = "";

    //{View_OrgStr1.Uni-Code}=0 and {View_OrgStr1.FacultyCode}=119 
    //sq = "{View_StudentAddNew.Student_ID}=" + Session["AnyVal"];
    if (Session["AnyVal"].ToString() != "")
    {
        sq = "{View_EmplDetail.Emp_no}=" + int.Parse(Session["AnyVal"].ToString());
    }

    //emp_card_report.Report.FileName = "../Student/CardFinal.rpt";
    emp_card_report_viewer.SelectionFormula = sq;
    //ConnectionInfo connInfo = new ConnectionInfo();
    //connInfo.ServerName = "172.16.0.15";
    //connInfo.DatabaseName = "MoHEMISDatabase";
    //connInfo.UserID = "myuser";
    //connInfo.Password = "myuser@sabir";
    //TableLogOnInfos crtt = new TableLogOnInfos();
    //TableLogOnInfo crtto = new TableLogOnInfo();
    //Tables crtables;
    //crtables = rpt.Database.Tables;
    //foreach (CrystalDecisions.CrystalReports.Engine.Table crtable in crtables)
    //{
    //    crtto = crtable.LogOnInfo;
    //    crtto.ConnectionInfo = connInfo;
    //    //crtable.ApplyLogInInfo(crtto);
    //}
    ConnectionInfo connInfo1 = new ConnectionInfo();
   // connInfo1.ServerName = "server";

    setDBLOGONforReport(connInfo1);



    //emp_card_report_viewer.RefreshReport();


    //ConnectionInfo connInfo = new ConnectionInfo();
    //connInfo.ServerName = "server";
    //connInfo.DatabaseName = "MoHEDatabase";
    //connInfo.UserID = "hemis_admin";
    //connInfo.Password = "hemis@sabir";



    //setDBLOGONforReport(connInfo);


    CrystalDecisions.Shared.PageMargins pageMargins = new
    CrystalDecisions.Shared.PageMargins(0, 0, 0, 0);
    rpt.PrintOptions.ApplyPageMargins(pageMargins);

    rpt.PrintOptions.PrinterName = printerList.SelectedItem.Value;
    emp_card_report_viewer.RefreshReport();

    rpt.PrintToPrinter(1, false, 1, 1);


    rpt.Close();
    rpt = null;
}

错误出现在:rpt.PrintToPrinter(1,falase,1,1);

知道哪里出错了吗???我已经注释掉了一些行,只是在检查它们......

任何帮助将不胜感激... tnx

4

2 回答 2

2

幸运的是,我怀疑您并不是说“在我编译之后”它会引发错误。我假设你的意思是“在我点击我的网络应用程序中的'btnPrintToPrinter'按钮之后”?无论如何,请更新问题以更具体地说明如何触发错误?

如果您的“btnPrintToPrinter”按钮在您单击它的那一刻就位于网页上,则您的数据库登录失败,这可能是因为您正在做两件相互矛盾的事情:

1) 您首先指定一个数据库作为报表的数据源。-THEN- 2) 您正在为报告设置连接详细信息,即

ConnectionInfo connInfo1 = new ConnectionInfo(); 
setDBLOGONforReport(connInfo1); 

删除设置连接信息的这些额外步骤。如果您向报告推送数据表,则报告不需要连接信息。(一旦您提供报告数据,它就不会连接到服务器以再次获取数据。)

注意:如果您在删除这些行后仍然看到问题。问题可能是您传递的数据表不是首先构建报告的数据表。例如:

1) 您使用名为“TableA”的表构建了报告,其中包含“field1”、“field2”和“field3”。2) 然后通过使用“field1”、“field2”、“fieldx”和“fieldz”查询“TableA”,在代码中构建一个数据表。3) 您将#2 中的表格传递到报告中。

这可能会导致数据库登录错误(即使它不是真正的登录问题)。因为报告是这样做的:

1)它尝试使用您传入的数据。然后它不能,因为这些字段与报告的设计内容不匹配。2)然后,没有数据的报告尝试连接到之前构建的数据库服务器。3) 由于您没有(也不应该)将有效的连接信息传递给报告,它现在会抛出“数据库登录失败”。

所以你看,这并不是因为登录失败你有问题。这是因为您提供的数据(这使得报告不需要连接)是无效数据。正如我之前所说,即使一个字段不同也会导致报告失败。事实上,即使只是更改单个字段的类型(例如将 varchar 更改为 int,或将 varchar(5) 更改为 nvarchar(10) 等),您传递的数据也可能与构建报告的数据不匹配。

所以在你的页面加载事件中(我假设你设置

于 2012-05-08T11:06:12.610 回答
2

我用过这个:

myReport.SetDatabaseLogon("username","password"); 

方法,它解决了问题。

于 2012-05-08T11:47:43.383 回答