每次在第二页上显示数据库登录提示

2020-08-17 18:08发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好

我遇到一个奇怪的问题,数据库登录提示仅出现在第二页(导航下一页)上。 我正在使用Visual Studio 2019社区版和Crystal Reports 13,更新27支持VS2019。 在针对表进行报告时,我没有这个特殊的问题,但是存储过程接受多个参数,并且过程中的选择引用了多个视图。 为了更容易理解:

  1. 我有两个数据库
  2. 生产和测试
  3. " sa"在两个数据库上都具有完全访问权限
  4. 在测试数据库上创建报告的视图/过程
  5. 在IDE中设计报告和进行审核时,我没有任何问题。 登录提示仅在调试和发布后出现。

该报告的调用方式如下

受保护的空白Page_Load(对象发送者,EventArgs e)
         {
             如果(!IsPostBack)
             {
                 ReportDocument reportDocument = new ReportDocument();
                 reportDocument.Load(Server.MapPath(@"〜/CrystalReport2.rpt"));
                 reportDocument.SetParameterValue(0,2020);
                 reportDocument.SetParameterValue(1,1);
                 reportDocument.SetParameterValue(2,3);
                 reportDocument.SetParameterValue(3," 1");
                 reportDocument.SetParameterValue(4," 1");

                 ConnectionInfo connectionInfo =新的ConnectionInfo
                 {
                     DatabaseName ="测试",
                     UserID =" sa",
                     密码="密码",
                     ServerName =" RAJESH-PC"
                 };

                 SetDBLogonForReport(connectionInfo,reportDocument);
                 CrystalReportViewer1.Visible = true;
                 CrystalReportViewer1.ReportSource = reportDocument;
             }
         } 

和SetDBLogonForReport方法如下:

私有无效SetDBLogonForReport(ConnectionInfo connectionInfo,ReportDocument rpt)
         {
             foreach(rpt.Subreports中的ReportDocument subRpt)
             {
                 foreach(subRpt.Database.Tables中的表crTable)
                 {
                     Response.Write(crTable.Name);
                     crTable.LogOnInfo.ConnectionInfo.AllowCustomConnection = true;
                     TableLogOnInfo logInfo = crTable.LogOnInfo;
                     logInfo.ConnectionInfo = connectionInfo;
                     尝试
                     {
                         crTable.ApplyLogOnInfo(logInfo);
                     }
                     抓住(前例外)
                     {
                         Response.Write(ex.Message);
                     }
                 }
             }

             foreach(rpt.Database.Tables中的表crTable)
             {
                 Response.Write(crTable.Name);
                 crTable.LogOnInfo.ConnectionInfo.AllowCustomConnection = true;
                 TableLogOnInfo loi = crTable.LogOnInfo;
                 loi.ConnectionInfo = connectionInfo;
                 尝试
                 {
                     crTable.ApplyLogOnInfo(loi);
                 }
                 抓住(前例外)
                 {
                     Response.Write(ex.Message);
                 }
             }
         } 

虽然在没有数据库登录提示的情况下执行单页报告,但经过2天的不懈努力寻找解决方案后,我有点完全迷失了。

致谢

rajesh

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好

我遇到一个奇怪的问题,数据库登录提示仅出现在第二页(导航下一页)上。 我正在使用Visual Studio 2019社区版和Crystal Reports 13,更新27支持VS2019。 在针对表进行报告时,我没有这个特殊的问题,但是存储过程接受多个参数,并且过程中的选择引用了多个视图。 为了更容易理解:

  1. 我有两个数据库
  2. 生产和测试
  3. " sa"在两个数据库上都具有完全访问权限
  4. 在测试数据库上创建报告的视图/过程
  5. 在IDE中设计报告和进行审核时,我没有任何问题。 登录提示仅在调试和发布后出现。

该报告的调用方式如下

受保护的空白Page_Load(对象发送者,EventArgs e)
         {
             如果(!IsPostBack)
             {
                 ReportDocument reportDocument = new ReportDocument();
                 reportDocument.Load(Server.MapPath(@"〜/CrystalReport2.rpt"));
                 reportDocument.SetParameterValue(0,2020);
                 reportDocument.SetParameterValue(1,1);
                 reportDocument.SetParameterValue(2,3);
                 reportDocument.SetParameterValue(3," 1");
                 reportDocument.SetParameterValue(4," 1");

                 ConnectionInfo connectionInfo =新的ConnectionInfo
                 {
                     DatabaseName ="测试",
                     UserID =" sa",
                     密码="密码",
                     ServerName =" RAJESH-PC"
                 };

                 SetDBLogonForReport(connectionInfo,reportDocument);
                 CrystalReportViewer1.Visible = true;
                 CrystalReportViewer1.ReportSource = reportDocument;
             }
         } 

和SetDBLogonForReport方法如下:

私有无效SetDBLogonForReport(ConnectionInfo connectionInfo,ReportDocument rpt)
         {
             foreach(rpt.Subreports中的ReportDocument subRpt)
             {
                 foreach(subRpt.Database.Tables中的表crTable)
                 {
                     Response.Write(crTable.Name);
                     crTable.LogOnInfo.ConnectionInfo.AllowCustomConnection = true;
                     TableLogOnInfo logInfo = crTable.LogOnInfo;
                     logInfo.ConnectionInfo = connectionInfo;
                     尝试
                     {
                         crTable.ApplyLogOnInfo(logInfo);
                     }
                     抓住(前例外)
                     {
                         Response.Write(ex.Message);
                     }
                 }
             }

             foreach(rpt.Database.Tables中的表crTable)
             {
                 Response.Write(crTable.Name);
                 crTable.LogOnInfo.ConnectionInfo.AllowCustomConnection = true;
                 TableLogOnInfo loi = crTable.LogOnInfo;
                 loi.ConnectionInfo = connectionInfo;
                 尝试
                 {
                     crTable.ApplyLogOnInfo(loi);
                 }
                 抓住(前例外)
                 {
                     Response.Write(ex.Message);
                 }
             }
         } 

虽然在没有数据库登录提示的情况下执行单页报告,但经过2天的不懈努力寻找解决方案后,我有点完全迷失了。

致谢

rajesh

付费偷看设置
发送
5条回答
骆驼绵羊
1楼 · 2020-08-17 18:55.采纳回答

感谢戴尔

我修复了链接。

更好的一个可能也是这个:

1985571-如何使用Crystal Reports查看器在Web应用程序中使用会话(完整代码)

https://launchpad.support.sap.com/#/notes/1985571

@ Rajesh,并将您的代码从Page_Load移到Page_Init,页面加载仅被调用一次。 MS早已发生了变化,所以现在所有页面刷新现在都由Page Init调用。

Don

Doze时光
2楼-- · 2020-08-17 19:11

问候 Dell Stinnett-Christy

抱歉,回复延迟。 好吧,Don共享的链接通常指向SAP文档? 此注释是为了更新线程。 最后,我弄清楚了Crystal Reports中推荐的"会话"和pa​​ge_init如何工作并成功完成了我的项目。

我将尽快发布样本作为答案。 再次感谢。

致谢

rajesh

愤怒的猪头君
3楼-- · 2020-08-17 19:10

如果这是一个Web应用程序,则需要将报告存储在会话变量中。 过去在Crystal for VS Wiki上有一个有关如何执行此操作的说明的链接,但此链接当前不起作用。

Don Williams ,Wiki中指向知识库文章2007224的链接不起作用-是否有此版本的新版本?

-Dell

# p#

感谢 Dell Stinnett-Christy Don Williams 供您输入。 我发现回发导致报表提示输入数据库凭据,并设法将其提供给报表查看器,从而永久停止了行为。 这是我第一次在Visual Studio/Web应用程序中使用Crystal Reports,并且在此锁定期间,几乎没有其他技术支持站点的答复。

感谢您的时间和答复。

致谢

Rajesh

xfwsx85
4楼-- · 2020-08-17 18:50

整个解决方案在此处发布。 这可能会帮助其他少数情况相同的人。

https://stackoverflow。 com/questions/61998462/crystal-report-on-asp-c-sharp-application-postback-issues

致谢

Rajesh

浮生未央
5楼-- · 2020-08-17 18:47

按照建议使用"会话"和" page_init"解决此要求。 请注意,我的应用程序需要在生成报告之前从最终用户收集很多输入,并且许多文本输入都将Autopostback设置为true。 每当发生自动回发时,Crystal Report都会刷新,因此我建议在Web表单中使用尽可能少的启用自动回发的输入字段。

示例ASP页面

 <%@页面语言=" C#" AutoEventWireup =" true" CodeBehind =" c4.aspx.cs" Inherits =" CrystalTest.c4"%>
 <%@ Register Assembly =" CrystalDecisions.Web,Version = 13.0.4000.0,Culture = neutral,PublicKeyToken = 692fbea5521e1304" Namespace =" CrystalDecisions.Web" TagPrefix =" CR"%>
 <!DOCTYPE html>
 
 
      
 
 <身体>
     

及其后面的代码(从原始测试表格复制而来,请确保您遵循建议的编码标准)。 请注意,此示例没有" page_load"方法,因此,如果在某些特定情况下需要使用page_load,则必须采用许多繁琐的方法,或者单击生成报告的按钮应重定向到您拥有该信息的页面 仅报告。

使用CrystalDecisions.CrystalReports.Engine;
 使用系统;
 使用System.Collections.Generic;
 使用System.Configuration;
 使用System.Data;
 使用System.Data.SqlClient;
 使用System.Linq;
 使用System.Web;
 使用System.Web.UI;
 使用System.Web.UI.WebControls;
 命名空间CrystalTest
 {
     公共局部类c4:System.Web.UI.Page
     {
         受保护的void Page_Init(对象发送者,EventArgs e)
         {
             如果(IsPostBack)
             {
                 CrystalReportViewer1.ReportSource =(ReportDocument)Session [" Report"];
             }
         }
         私有void ShowReport1()
         {
             字符串ConnectionString = ConfigurationManager.ConnectionStrings [" menass"]。ToString();
             使用(SqlConnection con = new SqlConnection(ConnectionString))
             {
                 使用(SqlCommand cmd =新的SqlCommand(" GETMONTHSALARY",con))
                 {
                     cmd.CommandType = CommandType.StoredProcedure;
                     cmd.Parameters.Add(" @ pProcessYear",SqlDbType.Int).Value = 2020;
                     cmd.Parameters.Add(" @ pProcessMonth",SqlDbType.Int).Value = 1;
                     cmd.Parameters.Add(" @ pProcessSection",SqlDbType.VarChar).Value =" 9";
                     cmd.Parameters.Add(" @ pProcessSite",SqlDbType.VarChar).Value =" 1";
                     cmd.Parameters.Add(" @ pProcessCatg",SqlDbType.VarChar).Value =" 1";
                     SqlDataAdapter适配器=新的SqlDataAdapter(cmd);
                     DataSet ds = new DataSet();
                     adapter.Fill(ds," SalaryDT");
                     ReportDocument oRpt = new ReportDocument();
                     oRpt.Load(Server.MapPath(@"〜/dataset/CrystalReport1.rpt"));
                     oRpt.DataSourceConnections.Clear();
                     oRpt.SetDataSource(ds);
                     oRpt.Subreports [0] .SetDataSource(FillOverTime());
                     CrystalReportViewer1.Visible = true;
                     CrystalReportViewer1.ReportSource = oRpt;
                     Session [" Report"] = oRpt;
                 }
             }
         }
         私有数据集FillOverTime()
         {
             字符串ConnectionString = ConfigurationManager.ConnectionStrings [" menass"]。ToString();
             使用(SqlConnection con = new SqlConnection(ConnectionString))
             {
                 使用(SqlCommand cmd =新的SqlCommand(" GetEmployeeOverTime",con))
                 {
                     cmd.CommandType = CommandType.StoredProcedure;
                     cmd.Parameters.Add(" @ pEmployeeCode",SqlDbType.VarChar).Value = DBNull.Value;
                     cmd.Parameters.Add(" @ pProcessYear",SqlDbType.Int).Value = 2020;
                     cmd.Parameters.Add(" @ pProcessMonth",SqlDbType.Int).Value = 1;
                     SqlDataAdapter适配器=新的SqlDataAdapter(cmd);
                     DataSet ds1 = new DataSet();
                     adapter.Fill(ds1," OverTimeDT");
                     返回ds1;
                 }
             }
         }
         受保护的void Button1_Click(对象发送者,EventArgs e)
         {
             ShowReport1();
         }
     }
 }
 

一周热门 更多>