4

レポートを生成していますが、認証情報を提供したにもかかわらず、CrystalReport を含むフォームが開くと、認証情報の入力を求められます。最悪の部分は、そこに何も入力しないことです。 [完了] をクリックするだけで、レポートが読み込まれます。それで、資格情報(またはその他のもの)が必要ない場合、なぜ私に尋ねているのですか?

これがコードです

    private void MainReport_Load(object sender, EventArgs e)
    {
        var constr = string.Empty;
        constr = Application.StartupPath;
        if (Generate.bForProjects)
            constr = Path.Combine(constr, @"Reports\Projects.rpt");
        else
            constr = Path.Combine(constr, @"Reports\Other.rpt");

        var myConInfo = new CrystalDecisions.Shared.TableLogOnInfo();
        reportDocument1.Load(constr);
        myConInfo.ConnectionInfo.DatabaseName = "ProjectData.mdb";
        myConInfo.ConnectionInfo.ServerName = Application.StartupPath + @"\Data\ProjectData.mdb";
        myConInfo.ConnectionInfo.Password = "";
        myConInfo.ConnectionInfo.UserID = "";
        reportDocument1.Database.Tables[0].ApplyLogOnInfo(myConInfo);

        reportDocument1.Refresh();

        crystalReportViewer1.ReportSource = reportDocument1;
        crystalReportViewer1.Width = this.Width - 50;
        crystalReportViewer1.Height = this.Height - 100;
    }

フォームが読み込まれると、この画面がポップアップします

ここに画像の説明を入力

そして、これが来たら、私は何も入力しません!それは正しい![完了] をクリックするだけで、レポートが完全に読み込まれます。では、何も必要ないのに、なぜ hel* がログインを要求するのでしょうか?

4

5 に答える 5

2

Crystal Reportを、設計/作成されたデータベースとは異なるデータベースに接続するようになったとき、多くの問題が発生しました。正しく設定するために、次の関数を作成することになりました。すべてのレポートテーブルとサブレポートに再帰的に接続を設定します。

また、レポートが統合Windows認証を使用して設計され、単純なユーザー名とパスワードで実行された場合に問題が発生したことを覚えているようです。そのため、データベースへの単純なユーザー名とパスワードの接続を使用してレポートを設計するように常に確認しました。

private static void SetConnection(ReportDocument report, string databaseName, string serverName, string userName, string password)
{
    foreach (Table table in report.Database.Tables)
    {
        if (table.Name != "Command")
        {
            SetTableConnectionInfo(table, databaseName, serverName, userName, password);
        }
    }

    foreach (ReportObject obj in report.ReportDefinition.ReportObjects)
    {
        if (obj.Kind != ReportObjectKind.SubreportObject)
        {
            return;
        }

        var subReport = (SubreportObject)obj;
        var subReportDocument = report.OpenSubreport(subReport.SubreportName);
        SetConnection(subReportDocument, databaseName, serverName, userName,  password);
    }
}

private static void SetTableConnectionInfo(Table table, string databaseName, string serverName, string userName, string password)
{
    // Get the ConnectionInfo Object.
    var logOnInfo = table.LogOnInfo;
    var connectionInfo = logOnInfo.ConnectionInfo;

    // Set the Connection parameters.
    connectionInfo.DatabaseName = databaseName;
    connectionInfo.ServerName = serverName;
    connectionInfo.Password = password;
    connectionInfo.UserID = userName;
    table.ApplyLogOnInfo(logOnInfo);

    if (!table.TestConnectivity())
    {
        throw new ApplicationException(Resource.UnableToConnectCrystalReportToDatabase);
    }

    table.Location = Database + "." + "dbo" + "." + table.Location;
}
于 2012-07-13T15:40:16.623 に答える
1

レポート オブジェクトを作成し、リンクの下に追加するだけです。rptobj は CrystalReport オブジェクトで、setdatabaselogin はユーザー ID とパスワードをパラメーターとして受け取るメソッドです。

rptobj.setdatabaselogon(userid,password)

于 2013-05-21T08:30:02.907 に答える