簡體   English   中英

Crystal報表的PrintToPrinter方法拋出登錄異常

[英]PrintToPrinter method for crystal reports throws logon exception

我在我的網站上使用PrintToPrinter(1,false,1,1)來獲取水晶報告。 單擊此按鈕(btnPrintToPrinter)后,它會拋出LogOnException並說數據庫登錄失敗:

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

幸運的是,我懷疑你並不是說“我編譯后”它會拋出錯誤。 我假設你的意思是“在我的網絡應用程序中單擊我的'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)等),也可以使您傳遞的數據與構建報告的數據不匹配。

所以在你的頁面加載事件中(我假設你設置了)

我用過這個:

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

方法,它解決了這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM