2015-02-23 61 views
-2

我在服務器上使用Oracle數據庫並使用20.34.34.4 ip 我想用csharp創建客戶端服務器應用程序,但是我可以在連接到包含服務器的客戶端上創建水晶報表數據庫以及如何,謝謝。如何將水晶報表連接到遠程數據庫

+0

你能解釋一下你的環境? Oracle 11? C#4? Windows Server 64位? Net 4.5?有很多方法沒有連接它。在SAP論壇網站,你可以找到很多方法來做到這一點。但最困難的部分是要配置您的應用程序和環境來設置一些連接。請修改您的帖子並告訴我們更多。嘗試之前再去 - https://infynet.wordpress.com/2010/10/06/crystal-report-in-c/ – 2015-02-23 19:13:03

+0

Oracle 11和visual csharp 2008我的服務器是Windows服務器2008 – tareqp 2015-02-23 19:19:07

+0

Visual CSharp 2008是IDE 。 Server 2008 32或64位? C#2.0或更新版本?水晶版本? – 2015-02-23 19:27:21

回答

0

好,

考慮到你的環境是: - Windows Server 2008的64位

  • C#4

  • 甲骨文11

  • Suposing水晶13

最初,你應該做的幾件事情:

  • ,如果你的操作系統是64位的,您必須安裝Oracle驅動程序64,然後在同一home_oracle安裝Oracle驅動程序32,這不應該是和home1。 SAP只與home1一起工作。

  • 您必須安裝Oracle客戶端管理員模式。

  • 之後您必須配置您的ODBC驅動程序到Oracle主頁1.現在測試您的ODBC連接是否成功。
  • 你的應用程序不應該在32位模式下運行。
  • 如果安裝了兩個版本的Oracles都不會忘記您必須在主頁1上安裝兩個驅動程序,並且在兩個實例中都具有相同的TNSNAMES.ORA。另外不要忘記que必須以管理員模式安裝。

好做一個.NET Web應用程序使用Crystal Reports連接到Oracle,那麼你應該確保幾件事情:

  1. 安裝在服務器上的CR版本相匹配您使用的一個您的應用程序/網站

  2. 闕的CR的服務器上安裝的組件在你的web.config

  3. 設置應用程序池正確引用您的應用程序下允許LOCAL SERVICE操作

  4. 完全信任模式是在你的工作文件夾啓用

  5. 的CrystalReportViewer aspnet_client和文件夾複製到服務器的操作系統文件夾。

這裏是下載頁面:

Oracle

SAP Crystal

這裏是源代碼:

的web.config

<?xml version="1.0"?> 
<configuration> 
    <connectionStrings> 
     <add name="ConnectionString" connectionString="Data Source=DATA_BASE_NAME;Persist Security Info=True;User ID=USERNAME;Password=PASSWORD;pooling=false;" providerName="System.Data.OracleClient"/> 
    </connectionStrings> 
    <appSettings> 
     <add key="db" value="DATA_BASE_NAME"/> 
     <add key="connectionString" value="Data Source=DATA_BASE_NAME;Persist Security Info=True;User ID=USERNAME;Password=PASSWORD;pooling=false;"/> 
    </appSettings> 
    <system.web> 
     <compilation debug="true" defaultLanguage="c#" targetFramework="4.0"> 
      <assemblies> 
       <add assembly="System.Data.OracleClient, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> 
       <add assembly="CrystalDecisions.CrystalReports.Engine, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/> 
       <add assembly="CrystalDecisions.ReportAppServer.ClientDoc, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/> 
       <add assembly="CrystalDecisions.ReportSource, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/> 
       <add assembly="CrystalDecisions.Shared, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/> 
       <add assembly="CrystalDecisions.Web, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/> 
      </assemblies> 
     </compilation> 
    </system.web> 
</configuration> 

ReportByCrystal.aspx.cs

<%@ Page Language="C#" AutoEventWireup="true" Theme="theme" CodeFile="ReportByCrystal.aspx.cs" 
    Inherits="ReportByCrystal" Title="Report By Crystal" %> 

<%@ Register Assembly="CrystalDecisions.Web, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" 
    Namespace="CrystalDecisions.Web" TagPrefix="CR" %> 
<head> 

</head> 
<body> 
    <form id="ReportCrystal" runat="server"> 
     <div> 
      <CR:CrystalReportViewer ID="crvCrystalReport" runat="server" AutoDataBind="true" /> 
     </div> 
    </form> 
</body> 

ReportByCrystal.cs

using CrystalDecisions.Shared; 
using CrystalDecisions.CrystalReports.Engine; 
using CrystalDecisions.Web; 

public partial class ReportByCrystal : Page 
{ 
    //#region [ Page Events ] 

    /// <summary> 
    /// 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     try 
     { 
      this.ReportParameter(); 
     } 
     catch (Exception exc) 
     { 

     } 

     if (!IsPostBack) 
     { 

     } 
    } 

    //#endregion 

    //#region [ Methods ] 

    /// <summary> 
    /// 
    /// </summary> 
    private void ReportParameter() 
    { 
     string reportName = "ReportName.rpt" 
     string reportPath = Server.MapPath(String.Concat("~/reports/source/", reportName)); 
     string serverName = System.Configuration.ConfigurationManager.AppSettings["db"].ToString(); 
     string databaseName = String.Empty; 
     string userId = Session["USERNAME"].ToString(); 
     string password = Session["PASSWORD"].ToString(); 

     if (File.Exists(reportPath)) 
     { 
      ReportDocument reportDoc = new ReportDocument(); 
      reportDoc.Load(reportPath); 

      foreach (ParameterField paramField in reportDoc.ParameterFields) 
      { 
       paramField.CurrentValues.Clear(); 
      } 

      reportDoc.SetDatabaseLogon(userId, password, serverName, databaseName); 

      ConnectionInfo crConnectionInfo = new ConnectionInfo(); 
      crConnectionInfo.Type = ConnectionInfoType.SQL; 
      crConnectionInfo.AllowCustomConnection = true; 
      crConnectionInfo.IntegratedSecurity = false; 
      crConnectionInfo.ServerName = serverName; 
      crConnectionInfo.DatabaseName = databaseName; 
      crConnectionInfo.UserID = userId; 
      crConnectionInfo.Password = password; 

      this.ApplyConnection(reportDoc, crConnectionInfo); 

      this.crvCrystalReport.EnableParameterPrompt = true; 
      this.crvCrystalReport.ReportSource = reportDoc; 
      this.crvCrystalReport.RefreshReport(); 
     } 
     else 
     { 
      this.ltrTitulo.Text = String.Concat("Report not found."); 
     } 
    } 

    /// <summary> 
    /// 
    /// </summary> 
    /// <param name="report"></param> 
    /// <param name="connectionInfo"></param> 
    private void ApplyConnection(ReportDocument report, ConnectionInfo connectionInfo) 
    { 
     this.ApplyLogOnInfo(report, connectionInfo); 
     this.ApplyLogOnInfoForSubreports(report, connectionInfo); 
    } 

    /// <summary> 
    /// 
    /// </summary> 
    /// <param name="reportDocument"></param> 
    /// <param name="connectionInfo"></param> 
    private void ApplyLogOnInfo(ReportDocument reportDocument, ConnectionInfo connectionInfo) 
    { 
     foreach (CrystalDecisions.CrystalReports.Engine.Table tableTemp in reportDocument.Database.Tables) 
     { 
      if (tableTemp.Name.ToUpper().StartsWith("COMMAND")) 
      { 

      } 

      TableLogOnInfo tableLogonInfo = tableTemp.LogOnInfo; 
      tableLogonInfo.ConnectionInfo = connectionInfo; 
      tableTemp.ApplyLogOnInfo(tableLogonInfo); 

      bool b = tableTemp.TestConnectivity(); 
     } 
    } 

    /// <summary> 
    /// 
    /// </summary> 
    /// <param name="reportDocument"></param> 
    /// <param name="connectionInfo"></param> 
    private void ApplyLogOnInfoForSubreports(ReportDocument reportDocument, ConnectionInfo connectionInfo) 
    { 
     foreach (Section sectionTemp in reportDocument.ReportDefinition.Sections) 
     { 
      foreach (ReportObject reportObjectTemp in sectionTemp.ReportObjects) 
      { 
       if (reportObjectTemp.Kind == ReportObjectKind.SubreportObject) 
       { 
        SubreportObject subreportObject = (SubreportObject)reportObjectTemp; 

        ReportDocument subReportDocument = subreportObject.OpenSubreport(subreportObject.SubreportName); 

        this.ApplyLogOnInfo(subReportDocument, connectionInfo); 
       } 
      } 
     } 
    } 
} 

問候,

安德魯·佩斯

相關問題