1

Crystal Report の Web サイトで PrintToPrinter(1,false,1,1) を使用しています。このボタン (btnPrintToPrinter) をクリックすると、LogOnException がスローされ、Database Logon failed と表示されます。

protected void btnPrintToPrinter_Click(object sender, EventArgs e)
{
    int empno = Convert.ToInt32(Session["AnyVal"]);

    SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);



    string strQuery = "SELECT [View_EmplDetail].[Uni-Code], [View_EmplDetail].[FacultyCode], [View_EmplDetail].[EmpIDstr], [View_EmplDetail].[EngGivenName], [View_EmplDetail].[position_eng], [View_EmplDetail].[Emp_no], [View_EmplDetail].[GivenName], [View_EmplDetail].[position_name], [View_EmplDetail].[DariName], [Tbl_Dept].[EName], [View_EmplDetail].[photo] FROM   [MoHEDatabase].[dbo].[View_EmplDetail] [View_EmplDetail] INNER JOIN [MoHEDatabase].[dbo].[Tbl_Dept] [Tbl_Dept] ON [View_EmplDetail].[DepCode]=[Tbl_Dept].[DepCode] WHERE  [Emp_no] = @empno";
    SqlCommand command = new SqlCommand(strQuery, connection);
    command.CommandType = System.Data.CommandType.Text;

    command.Parameters.AddWithValue("@empno", empno);
    command.Connection = connection;
    command.Connection.Open();

    SqlDataAdapter da = new SqlDataAdapter(command);
    DataTable dt = new DataTable();
    da.Fill(dt);

    ReportDocument rpt = new ReportDocument();
    string _reportPath = Server.MapPath("..\\Student\\cardFinal.rpt");
    //rpt.Load(AppDomain.CurrentDomain.BaseDirectory + "\\" + @"\\Student\\CardFinal.rpt");
    rpt.Load(_reportPath);

    rpt.SetDataSource(dt);
    emp_card_report_viewer.ReportSource = rpt;

    string sq = "";

    //{View_OrgStr1.Uni-Code}=0 and {View_OrgStr1.FacultyCode}=119 
    //sq = "{View_StudentAddNew.Student_ID}=" + Session["AnyVal"];
    if (Session["AnyVal"].ToString() != "")
    {
        sq = "{View_EmplDetail.Emp_no}=" + int.Parse(Session["AnyVal"].ToString());
    }

    //emp_card_report.Report.FileName = "../Student/CardFinal.rpt";
    emp_card_report_viewer.SelectionFormula = sq;
    //ConnectionInfo connInfo = new ConnectionInfo();
    //connInfo.ServerName = "172.16.0.15";
    //connInfo.DatabaseName = "MoHEMISDatabase";
    //connInfo.UserID = "myuser";
    //connInfo.Password = "myuser@sabir";
    //TableLogOnInfos crtt = new TableLogOnInfos();
    //TableLogOnInfo crtto = new TableLogOnInfo();
    //Tables crtables;
    //crtables = rpt.Database.Tables;
    //foreach (CrystalDecisions.CrystalReports.Engine.Table crtable in crtables)
    //{
    //    crtto = crtable.LogOnInfo;
    //    crtto.ConnectionInfo = connInfo;
    //    //crtable.ApplyLogInInfo(crtto);
    //}
    ConnectionInfo connInfo1 = new ConnectionInfo();
   // connInfo1.ServerName = "server";

    setDBLOGONforReport(connInfo1);



    //emp_card_report_viewer.RefreshReport();


    //ConnectionInfo connInfo = new ConnectionInfo();
    //connInfo.ServerName = "server";
    //connInfo.DatabaseName = "MoHEDatabase";
    //connInfo.UserID = "hemis_admin";
    //connInfo.Password = "hemis@sabir";



    //setDBLOGONforReport(connInfo);


    CrystalDecisions.Shared.PageMargins pageMargins = new
    CrystalDecisions.Shared.PageMargins(0, 0, 0, 0);
    rpt.PrintOptions.ApplyPageMargins(pageMargins);

    rpt.PrintOptions.PrinterName = printerList.SelectedItem.Value;
    emp_card_report_viewer.RefreshReport();

    rpt.PrintToPrinter(1, false, 1, 1);


    rpt.Close();
    rpt = null;
}

エラーが次の場所に表示されます: rpt.PrintToPrinter(1,falase,1,1);

どこがうまくいかないのですか?一部の行をコメントアウトしましたが、それらをチェックしているだけです...

任意の助けをいただければ幸いです... tnx

4

2 に答える 2

2

私はこれを使用しました:

myReport.SetDatabaseLogon("username","password"); 

メソッドとそれは問題を解決しました。

于 2012-05-08T11:47:43.383 に答える
2

幸いなことに、「コンパイルした後」にエラーがスローされるという意味ではないと思います。「Web アプリケーションで「btnPrintToPrinter」ボタンをクリックした後」という意味だと思いますか? いずれにせよ、質問を更新して、エラーをトリガーする方法をより具体的にしてください。

クリックした瞬間に「btnPrintToPrinter」ボタンが Web ページ上にある場合、データベースへのログオンに失敗します。おそらく、互いに矛盾する 2 つのことを行っているためです。

1) 最初にデータベースをレポートのデータソースとして割り当てます。-THEN- 2) レポートの接続の詳細を設定しています。

ConnectionInfo connInfo1 = new ConnectionInfo(); 
setDBLOGONforReport(connInfo1); 

接続情報を設定するこれらの余分な手順を削除します。レポートにデータテーブルをプッシュしている場合、レポートに接続情報は必要ありません。(レポート データをフィードすると、サーバーに接続してデータを再度取得することはありません。)

注: これらの行を削除しても問題が解決しない場合。問題はおそらく、渡しているデータテーブルが、レポートが最初に構築されたものではないことです。例えば:

1) 「field1」、「field2」、および「field3」を含む「TableA」という名前のテーブルを使用してレポートを作成しました。2) 次に、'TableA' を 'field1'、'field2'、'fieldx' および 'fieldz' でクエリして、コード内にデータテーブルを作成します。3) #2 のテーブルをレポートに渡します。

これにより、データベース ログオン エラーが発生する可能性があります (実際にはログオンの問題ではありません)。レポートがこれを行うため:

1)渡されたデータを使用しようとします。フィールドがレポートの設計元と一致しないため、できません。2) その後、レポートは、データを持たないため、以前に作成されたデータベース サーバーに接続しようとします。3) 有効な接続情報をレポートに渡していない (渡すべきではない) ため、「データベース ログオンに失敗しました」がスローされるようになりました。

お分かりのように、問題が発生したのは、ログオンに失敗したからではありません。これは、あなたが提供したデータ (レポートを接続する必要がなくなります) が無効なデータだったためです。前述したように、フィールドが 1 つでも異なると、レポートが失敗する可能性があります。実際、1 つのフィールドの型を変更しただけでも (varchar を int に、または varchar(5) を nvarchar(10) に、など)、渡すデータがレポートの作成元のデータと一致しなくなる可能性があります。

だからあなたのページロードイベントで(私はあなたが設定したと仮定しています

于 2012-05-08T11:06:12.610 に答える