現在、ビジュアル スタジオの Web サイトに Crystal レポートが埋め込まれています。Web サイトを展開して IIS にインストールし、ユーザーにリンクを提供して、ユーザーがグローバルにアクセスしてこのレポートを表示できるようにします。このシステムはうまく機能しています。
ただし、サブレポートを持つ Crystal レポートを埋め込んだ場合、認証情報がサブレポートに自動的に渡されません。ソリューションをデバッグすると、最初のレポートが正常に開きます。項目をクリックしてサブレポートを開くと、Crystal Report Viewer がデータベースのログイン資格情報を要求します。
Crystal Report Viewer で表示するときにユーザーがコードを入力する必要がないように、これらの資格情報をコードで自動的に渡すにはどうすればよいですか。
以下は、default.aspx.cs ページで使用するコードです。接続文字列が含まれています。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
namespace CFIBInventory
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection("Data Source=HPL-WTS;Initial Catalog=Enterprise32;Persist Security Info=True;User ID=sa;Password=********");
DataSet1 ds = new DataSet1();
SqlDataAdapter adapter = new SqlDataAdapter("SELECT dbo.Material.MaterialCode, dbo.Material.CategoryCode, dbo.Material.Description, dbo.MaterialOnHand.LocationCode, dbo.Material.ValuationMethod, dbo.MaterialOnHand.Quantity FROM dbo.Material INNER JOIN dbo.MaterialOnHand ON dbo.Material.MaterialCode = dbo.MaterialOnHand.MaterialCode WHERE (dbo.Material.CategoryCode = 'CFIB3') AND (dbo.Material.ValuationMethod = 1) AND (dbo.Material.InactiveFlag = 0)", con);
adapter.Fill(ds.cfibInventory);
CrystalReport1 report = new CrystalReport1();
report.SetDataSource(ds);
CrystalReportViewer1.ReportSource = report;
CrystalReportViewer1.ToolPanelView = CrystalDecisions.Web.ToolPanelViewType.None;
}
}
}
Crystal レポート ビューアーは、次のコードを使用して .aspx ページに埋め込まれています。
<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
CodeBehind="Default.aspx.cs" Inherits="CFIBInventory._Default" %>
<%@ Register assembly="CrystalDecisions.Web, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" namespace="CrystalDecisions.Web" tagprefix="CR" %>
<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<p>
</p>
<CR:CrystalReportViewer ID="CrystalReportViewer1" runat="server"
AutoDataBind="true" />
</asp:Content>
サブレポートのクエリは、サブレポートのデータベース エキスパートにあります。
ところで、データベースは Windows Server 2005 マシンに接続しています。独自の IIS などのパブリック アクセス設定があるとは思えません。サブレポートを持たない以前のレポートは、データベースがある新しい 2012 サーバーにインストールされます。マシンが Crystal Report Viewer の追加のログイン プロンプトと関係があるかどうかは不明です。
どんな助けでも素晴らしいでしょう。前もって感謝します!
編集: Nimesh のソリューションを実装した後
さて、接続された接続タイプを追加しましたが、ビジュアルスタジオは「レポート」に下線を付けて、宣言する前にローカル変数「レポート」を使用できません。
foreach (レポート.Database.Tables の CrystalDecisions.CrystalReports.Engine.Table CrTable)
と
foreach (レポート.Subreports 内の ReportDocument サブレポート)
レポートを後で新しいcrystalreport1として宣言していることに気付きました。したがって、その宣言を Nimesh コード ブロックの上に移動すると、「レポート」の赤い下線が消えますが、「crtableLogoninfo」の 6 つのインスタンスすべてに赤い下線が引かれ、「名前 'crtableLogoninfo' は現在のコンテキストに存在しません」というエラーが表示されます。
それ以上の助けをいただければ幸いです。
以下は私のコードがどのように見えるかです:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using CrystalDecisions.Shared;
using CrystalDecisions.CrystalReports.Engine;
namespace CFIBInventory
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//Nimesh code
ConnectionInfo crConnectionInfo = new ConnectionInfo();
crConnectionInfo.ServerName = "HPL-WTS";
crConnectionInfo.DatabaseName = "Enterprise32";
crConnectionInfo.UserID = "sa";
crConnectionInfo.Password = "*********";
foreach (CrystalDecisions.CrystalReports.Engine.Table CrTable in report.Database.Tables)
{
crTableLogoninfo = CrTable.LogOnInfo;
crtableLogoninfo.ConnectionInfo = crConnectionInfo;
CrTable.ApplyLogOnInfo(crtableLogoninfo);
}
foreach (ReportDocument subreport in report.Subreports)
{
foreach (CrystalDecisions.CrystalReports.Engine.Table CrTable in subreport.Database.Tables)
{
crtableLogoninfo = CrTable.LogOnInfo;
crtableLogoninfo.ConnectionInfo = crConnectionInfo;
CrTable.ApplyLogOnInfo(crtableLogoninfo);
}
} // nimesh code end
//Old connection string, i assume this shouldnt be here since nimesh code is for connecting
//SqlConnection con = new SqlConnection("Data Source=HPL-WTS;Initial Catalog=Enterprise32;Persist Security Info=True;User ID=sa;Password=123qwerTy987");
DataSet1 ds = new DataSet1();
SqlDataAdapter adapter = new SqlDataAdapter("SELECT dbo.Material.MaterialCode, dbo.Material.CategoryCode, dbo.Material.Description, dbo.MaterialOnHand.LocationCode, dbo.Material.ValuationMethod, dbo.MaterialOnHand.Quantity FROM dbo.Material INNER JOIN dbo.MaterialOnHand ON dbo.Material.MaterialCode = dbo.MaterialOnHand.MaterialCode WHERE (dbo.Material.CategoryCode = 'CFIB3') AND (dbo.Material.ValuationMethod = 1) AND (dbo.Material.InactiveFlag = 0)", con);
adapter.Fill(ds.cfibInventory);
CrystalReport1 report = new CrystalReport1();
// OLD CODE
//report.SetDataSource(ds);
CrystalReportViewer1.ReportSource = report;
CrystalReportViewer1.ToolPanelView = CrystalDecisions.Web.ToolPanelViewType.None;
}
}
}