Crystal Reports for Visual Studio 2010 (13.0.4)使用紀錄(報表更新問題)

Crystal Reports 報表更新問題

學期初幫學校設計一個網路填報的程式,其中使用Crystal Reports for Visual Studio 2010 (13.0.4)設計報表,原本以為利用 Visual Studio 2010 的 Crystal Reports 精靈設計報表,再搭配 CrystalReportViewer 任務就完成。結果發佈至網站之後,教學組長反應查詢報表時一直出現要登入使用者名稱與密碼的視窗。

image

可是在產生報表與設定 CrystalReportViewer 時關於資料庫的連接並未設定任何的密碼。所以根本無法輸入合於要求的帳號與密碼, 重新修改資料庫連結

加入使用者名稱與密碼,依然無法改善這個問題。

image

執行Visual Studio 2010 的 Crystal Reports \ 設定資料來源位置

image

修改工作階段使用者ID為Admin,再發佈一次就沒有出現輸入帳密的畫面。

imageimageimage

可以出現報表的樣子,但是內容並沒有呈現只見到一排的凹凸的欄位在上面,後來發現這種情形會出現在瀏覽器IE10的狀況下。

image

但是怪的是在剛加入報表與 CrystalReportViewer 的webform檔案時,也並沒有出現需要輸入帳號密碼的畫面,發佈至網站時也沒有出現要輸入帳密的畫面。為什麼經過一段時間會出現出現要輸入帳號密碼的情況,原本以為是權限設定的問題,所以一直朝向設定IIS_IUSRS權限去測試。

image

結果還是一樣,而且報表資料並不會和資料庫同步。原本想可能是沒有將報表重新整理,所以把重新整理的按鈕屬性加上,結果是只要按下重新整理報表

image

結果就是又跑出登入帳號密碼的表單。

image

如果把 CrystalReportViewer 屬性 EnableDatabaseLogonPrompt 改為 false

image

結果出現資料庫登入失敗。

image

不信邪把所有設定的屬性重新檢查一次,實在是看不出來那一個設定造成需要登入帳號密碼。如同Lippman在他的書提到的解決程式的問題有時候需要的不是頑強的氣質,而是有人為我們指點迷津。上google去搜尋這個問題,一堆Crystal Report登入問題,很多是提到資料來源是連接 SQL SERVER ,所以在連結資料來源時把帳號密碼寫在連結的程式中。但是像我使用ACCESS的.MDB檔案當作資料庫檔案,並沒有設定任何的帳號密碼,不知為何 CrystalReportViewer 會一直要求輸入帳號密碼?

連結到MSDN查詢關於 CrystalReportViewer 連結資料來源,發現大部分的範例都是要利用程式碼去連結報表與資料來源,並沒有提到利用  CrystalReportViewer 屬性設定就能完成報表的連結。所以看起來我們利用Crystal Reports 精靈設計報表,簡單再搭配 CrystalReportViewer 的屬性設定就完成任務的美夢已經破滅。看起來利用此種方式產生的報表只能以靜態的方式呈現,不會自動與資料庫同步,要透過重新連結資料來源產生新報表,才能與資料庫同步。

所以必須在程式中加入一些程式碼,我把MSDN給的範例修改進行測試,問題就解決了。

 


protected void Page_Load(object sender, EventArgs e)
    {
      
        ConfigureCrystalReports();

        
    }


    private void ConfigureCrystalReports()
    {
        ReportDocument MyReport = new ReportDocument();
        MyReport = new CrystalDecisions.CrystalReports.Engine.ReportDocument();
        MyReport.Load(Server.MapPath("報表檔案所在"));
        string strquery = " SELECT ........";
        SetDataSource(getcon(), strquery, MyReport);
        this.CrystalReportViewer1.ReportSource = MyReport;
        ConnectionInfo connectionInfo = new ConnectionInfo();
        connectionInfo.ServerName = "";
        connectionInfo.DatabaseName = "";
        connectionInfo.UserID = "";
        connectionInfo.Password = "";
        SetDBLogonForReport(connectionInfo, MyReport);

    }
    private void SetDataSource(string conn, string query,  ReportDocument reportDocument)
    {
        DataSet dataSet = new DataSet();

        OleDbConnection oleConn = new OleDbConnection(conn);
        OleDbDataAdapter oleAdapter = new OleDbDataAdapter();
        oleAdapter.SelectCommand = new OleDbCommand(query, oleConn);

        oleAdapter.Fill(dataSet, "table名稱");

        reportDocument.SetDataSource(dataSet);
    }
private string getcon()
    {
System.Configuration.Configuration rootWebConfig =  System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("web.config檔案所在目錄");
System.Configuration.ConnectionStringSettings connString;
        if (0 < rootWebConfig.ConnectionStrings.ConnectionStrings.Count)
        {
            connString = rootWebConfig.ConnectionStrings.ConnectionStrings["web.config檔案中連結資料庫的連結字串名稱"];
            if (null != connString) 
              return connString.ConnectionString;
            else
                return "";
        }

        return "";

    }
    private void SetDBLogonForReport(ConnectionInfo connectionInfo, ReportDocument reportDocument)

    {
        Tables tables = reportDocument.Database.Tables;
        TableLogOnInfos tableLogOnInfos = CrystalReportViewer1.LogOnInfo;
        foreach (CrystalDecisions.CrystalReports.Engine.Table table in tables)
        {
            TableLogOnInfo tableLogonInfo = table.LogOnInfo;
            tableLogonInfo.ConnectionInfo = connectionInfo;
            table.ApplyLogOnInfo(tableLogonInfo);
        }
       
    }

在Page_Load中加入一個ConfigureCrystalReports()函式,讓WEBFORM載入時重新連結報表,程式碼有中文的部分請自行修改讀者的環境,即可進行報表與資料庫同步。

ps:注意各個檔案目錄設定(例如.rpt檔案所在的目錄),尤其是發佈至Server的虛擬目錄時,注意參數的設定,以免出現找不到檔案,而出現類似以下的錯誤訊息:

不支援的作業。由 JRC 引擎所處理的文件無法在 C++ 堆疊中開啟。

描述: 在執行目前 Web 要求的過程中發生未處理的例外情形。請檢閱堆疊追蹤以取得錯誤的詳細資訊,以及在程式碼中產生的位置。

cool      歡迎引用,請注明來源出處!

作者:楊煥謀