2012-05-07 70 views
1

我在我的網站中使用PrintToPrinter(1,false,1,1)進行水晶報告。當我點擊這個按鈕(btnPrintToPrinter)它拋出LogOnException並說數據庫登錄失敗:出現在PrintToPrinter方法爲水晶報告拋出登錄異常

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 = "[email protected]"; 
    //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 = "[email protected]"; 



    //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

回答

2

幸運的是,我懷疑你不是說「我編譯之後加入」它會拋出錯誤。我假設你的意思是「在我的web應用程序中單擊'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)等等),也可以使你傳遞的數據與報告的內容不匹配。

在你的頁面加載事件

所以(其中我假設你設置

+0

謝謝迪倫,它是有幫助.... – Lucky

+0

我更新了這篇文章......我點擊btnPrintToPrinter ...;) – Lucky

2

我已經使用這個:

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

方法,它解決了這個問題

+0

幸運的是,如果您使用的是SetDatabaseLogon,報告​​通常會轉到數據庫,而不是使用您傳遞給它的數據集。因此,官方應該知道將數據集傳遞給報表應該不需要調用SetDatabaseLogon。 –

+0

亞,但如果我沒有通過數據集這種方式後,我的報告導出爲PDF或打印報告沒有數據將出現在PDF /打印的文件....如果我不使用SetDatabaseLogon它會引發錯誤....! ! – Lucky

+0

是的,我明白。如果是這種情況,我敢打賭,如果你刪除「rpt.SetDataSource(dt);」以及所有構建「dt」數據表的代碼,它仍然可以工作。嘗試一下。 :D –