2011-06-21 103 views
3

我使用....水晶報表登錄失敗問題

Framework 3.5的C#Visual Studio 2008和基於Web的應用程序

使用的數據集,即我的服務,我已經創建的報告使我的數據集和我那綁定帶報告的數據集。

但是有時CR瀏覽器開始彈出錯誤「Logon Failed」,登錄框中登錄信息中填充了數據集名稱。

我正在尋找它的解決方案很長一段時間,但沒有罰款任何合適的答案。

+0

你能發表一些代碼嗎? –

回答

2

經過很長時間的努力,我發現主要原因是存儲過程中返回數據的錯誤。

SP從table1或table2返回數據(它們都具有相同的結構),但是當我從table2中選取數據時,我沒有寫出所有需要的列名。

看起來很奇怪,我應該得到像列沒有找到錯誤,而不是數據庫登錄失敗的東西。

3

你沿着你的creditials傳遞代碼:

ReportDocument rep = new ReportDocument(); 
rep.FileName = Server.MapPath("CrystalReport1.rpt"); 
set.SetDatabaseLogon("username", "password", "sql-server", "database"); // this line pass the login parameters required for login 
+0

我綁定我的報告使用這樣的數據集: - ' DataSet ds = getReportData(); rpt.SetDataSource(ds); CrystalReportViewer1.ReportSource = rpt;' ' 現在我應該在用戶名/密碼等?因爲我不認爲數據集有任何密碼。 –

+0

你在哪裏檢索數據集的數據(數據庫,CSV,文本文件等)? –

1

嘗試了這一點。另外,還要確保你有水晶報表的正確版本在所有地方

private ConnectionInfo crConnectionInfo = new ConnectionInfo(); 
     ReportDocument rpt = new ReportDocument(); 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      CrystalReportViewer1.Width = 900; 
      CrystalReportViewer1.ToolPanelView = ToolPanelViewType.None; 
      BindReport(); 
     } 

     private void BindReport() 
     { 

      rpt.Load(Server.MapPath("ProductList.rpt")); 
      DataSet ds = getReportData(); 
      rpt.SetDataSource(ds.Tables[0]); 
      CrystalReportViewer1.ReportSource = rpt; 
     } 

     private DataSet getReportData() 
     { 
      DataSet ds = new DataSet(); 
      string ConnectionString = ConfigurationManager.ConnectionStrings["myconn"].ConnectionString; 
      SqlConnection con = new SqlConnection(ConnectionString); 
      SqlCommand cmd = new SqlCommand(); 
      cmd.CommandText = "GetProductList"; 
      cmd.CommandType = CommandType.StoredProcedure;    
      con.Open(); 
      cmd.Connection = con; 
      SqlDataAdapter sda = new SqlDataAdapter(cmd); 
      sda.Fill(ds, "ctable"); 
      con.Close(); 
      return ds; 
     } 
+0

在我的病例報告有時工作,而給我錯誤一段時間。我還發現它對某些特定的記錄很感興趣。異常細節並沒有讓我知道它爲什麼會發生。 –

+0

你有沒有試過我的代碼你是否在點擊報告中的下一頁時得到提示。另一件事是你使用子報表。您是在設計時製作數據集嗎? – Tassadaque

1

我當時面臨着同樣的問題,當我移動從開發計算機應用到真實服務器。這是一個IIS7 MVC應用程序(CR 13.0),對SQL服務器進行了可信驗證。

我修復它的方式是通過爲應用程序創建一個新的應用程序池。我將新應用程序池用戶IIS APPPOOL\applicationpoolname的權限授予應用程序中使用的SQL Server數據庫。 然後錯誤消失了。

我的假設是,通過代碼應用的userlogininfo並不總是被CR運行時使用,而是它使用IIS用戶登錄信息。

3

不幸的是,這個錯誤是不明確的,因爲它是幾十個無關問題的生成錯誤。在這種情況下,「登錄失敗」可能是由於偶爾的架構不匹配造成的。

DataSet對象可以包含分層數據。 如果您的服務正在返回包含分層數據的數據集,並且某些子項缺失,則其模式已有效更改。

有幾種方法可確保DataSet具有匹配的模式。如果您序列化對象到XML,然後從XML,然後生成DataSet中的簡單的方式實現一致的架構是從改變你的代碼:

reportData.ReadXml(new MemoryStream(Encoding.UTF8.GetBytes(reportXml))); 

reportData.ReadXmlSchema(schemaPath); 
reportData.ReadXml(
     new MemoryStream(Encoding.UTF8.GetBytes(reportXml)), 
     XmlReadMode.IgnoreSchema 
    ); 

其中schemaPath點到先前在發展與呼叫產生

File.WriteAllText(
     @"C:\MyTempPath\MyReportName.xsd", 
     reportData.GetXmlSchema(), 
     Encoding.Unicode 
    ); 

在生成模式XSD文件,你還希望該模式是作爲一個完整的再版儘可能地提供數據,因此您希望儘可能使用完整的數據層次結構。這也是報告必須從其創建以使其模式匹配的XML。如果模式發生變化,那麼必須在設計人員中使用新數據打開報告,並且必須「驗證數據庫」,然後保存RPT文件。