运行时无法更改数据库

2020-08-19 00:17发布

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

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


我们正在将Visual Studio CRRuntime_32bit_13_0_22的Crystal Reports与Visual Studio 2017和DB2 Windows数据库一起使用。

我们需要在运行时更改数据库连接(服务器,数据库,用户密码)。 我们的应用程序具有示例报告,我们将与我们的应用程序一起分发给客户。

在尝试预览报告时(如果使用WPF查看器,则有任何区别),将引发异常,并显示以下消息:

无法连接:错误的登录参数。

table.ApplyLogOnInfo(table.LogOnInfo);

发生异常

在加载报告时,在预览之前,将执行以下代码来更改连接信息。 我基于以下示例: https://wiki.scn.sap.com/wiki/display/BOBJ/Crystal+Reports+for+.NET+SDK+Samples?original_fqdn=wiki.sdn .sap.com#CrystalReportsfor.NETSDKS示例数据库

我没有使用子报表,因此没有遍历子报表列表。

这是我的代码:

私有void ChangeConnectionInfo(ReportDocument boReportDocument)
  {


 boReportDocument.SetDatabaseLogon(databaseUser,databasePassword,databaseServer,databaseName);


 TableLogOnInfo logOnInfo;
 foreach(boReportDocument.Database.Tables中的CrystalDecisions.CrystalReports.Engine.Table表)
 {
 logOnInfo = table.LogOnInfo;
 logOnInfo.ReportName = boReportDocument.Name;
 logOnInfo.ConnectionInfo.ServerName = databaseServer;
 logOnInfo.ConnectionInfo.DatabaseName = databaseName;
 logOnInfo.ConnectionInfo.UserID = databaseUser;
 logOnInfo.ConnectionInfo.Password = databasePassword;
 logOnInfo.TableName = table.Name;
 如果(schemaName.IsNotNullOrEmpty())
 table.Location = $" {schemaName}。{table.Name}";
 其他
 table.Location = table.Name;


 table.ApplyLogOnInfo(table.LogOnInfo);
 }
 }


 

我在调试时注意到的一件奇怪的事是,即使table.count为6,并且表可以为null,但我可以在调试器中查看整个列表。 我不知道这是问题的征兆还是调试器异常。

任何帮助将不胜感激。

埃里克

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

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


我们正在将Visual Studio CRRuntime_32bit_13_0_22的Crystal Reports与Visual Studio 2017和DB2 Windows数据库一起使用。

我们需要在运行时更改数据库连接(服务器,数据库,用户密码)。 我们的应用程序具有示例报告,我们将与我们的应用程序一起分发给客户。

在尝试预览报告时(如果使用WPF查看器,则有任何区别),将引发异常,并显示以下消息:

无法连接:错误的登录参数。

table.ApplyLogOnInfo(table.LogOnInfo);

发生异常

在加载报告时,在预览之前,将执行以下代码来更改连接信息。 我基于以下示例: https://wiki.scn.sap.com/wiki/display/BOBJ/Crystal+Reports+for+.NET+SDK+Samples?original_fqdn=wiki.sdn .sap.com#CrystalReportsfor.NETSDKS示例数据库

我没有使用子报表,因此没有遍历子报表列表。

这是我的代码:

私有void ChangeConnectionInfo(ReportDocument boReportDocument)
  {


 boReportDocument.SetDatabaseLogon(databaseUser,databasePassword,databaseServer,databaseName);


 TableLogOnInfo logOnInfo;
 foreach(boReportDocument.Database.Tables中的CrystalDecisions.CrystalReports.Engine.Table表)
 {
 logOnInfo = table.LogOnInfo;
 logOnInfo.ReportName = boReportDocument.Name;
 logOnInfo.ConnectionInfo.ServerName = databaseServer;
 logOnInfo.ConnectionInfo.DatabaseName = databaseName;
 logOnInfo.ConnectionInfo.UserID = databaseUser;
 logOnInfo.ConnectionInfo.Password = databasePassword;
 logOnInfo.TableName = table.Name;
 如果(schemaName.IsNotNullOrEmpty())
 table.Location = $" {schemaName}。{table.Name}";
 其他
 table.Location = table.Name;


 table.ApplyLogOnInfo(table.LogOnInfo);
 }
 }


 

我在调试时注意到的一件奇怪的事是,即使table.count为6,并且表可以为null,但我可以在调试器中查看整个列表。 我不知道这是问题的征兆还是调试器异常。

任何帮助将不胜感激。

埃里克

付费偷看设置
发送
7条回答
槿木_熙
1楼 · 2020-08-19 01:06.采纳回答

使用引擎仅用于更改服务器,前提是数据库未更改。

"下载WIKI"页面是我编写的用于使用ReplaceConnection()设置登录信息的应用程序。 看看是否适合您。

https: //wiki.scn.sap.com/wiki/display/BOBJ/Crystal+Reports%2C+Developer+for+Visual+Studio+Downloads

它是Parameter测试应用,位于页面的中间。

问题可能是您需要将数据库名称转换为String()。

Don

歪着头看世界
2楼-- · 2020-08-19 01:13

我是否需要对单个表的连接信息做任何事情,还是只对报表数据库调用一次ReplaceConnection?

Aaron 3364
3楼-- · 2020-08-19 01:09

使它

当学会了学习
4楼-- · 2020-08-19 01:13

如果我遍历Tables集合并使用Table.SetTableLocation设置登录信息,则会收到消息异常

文件列表中的错误BillTemplate_MODL 15980_3776_ {0164F666-AD2D-4195-946C-08D5FDA64D7B} .rpt:

无法连接:错误的登录参数。

我只能找到SetTableLocation或SetTableLocationEx方法。

我当前的代码如下。 表代码在注释"//设置新表位置"之后。

我显然错过了一些东西。

谢谢

埃里克。

私有无效ChangeConnectionInfo(ReportDocument boReportDocument)
 {
 {
 CrystalDecisions.ReportAppServer.ClientDoc.ISCDReportClientDocument rptClientDoc = boReportDocument.ReportClientDocument;


//创建一个新的数据库表来替换报表当前表。
 CrystalDecisions.ReportAppServer.DataDefModel.Table boTable = new CrystalDecisions.ReportAppServer.DataDefModel.Table();
 CrystalDecisions.ReportAppServer.DataDefModel.Table subboTable =新的CrystalDecisions.ReportAppServer.DataDefModel.Table();
 CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfo newConnInfo =新的CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfo();
 CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfo oldConnInfo;
 CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfos oldConnInfos;
//CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfo boConnectionInfo =新的CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfo();


////获取报告的数据库表集合
//CrystalDecisions.ReportAppServer.DataDefModel.Tables boTables;
//boTables = rptClientDoc.DatabaseController.Database.Tables;


//获取旧的连接信息
 oldConnInfos = rptClientDoc.DatabaseController.GetConnectionInfos(null);

//boTable.ConnectionInfo = boConnectionInfo;


 oldConnInfo = oldConnInfos [0];
 CrystalDecisions.ReportAppServer.DataDefModel.PropertyBag logonProperties =
 新的CrystalDecisions.ReportAppServer.DataDefModel.PropertyBag();
 CrystalDecisions.ReportAppServer.DataDefModel.PropertyBag oldlogonProperties =
 新的CrystalDecisions.ReportAppServer.DataDefModel.PropertyBag();


//遍历连接信息并复制到新的连接信息,并在适当时更改参数


//测试一下//
 字符串tmpProperty;
 动态tmpValue;
 for(int i = 0; i  
能不能别闹
5楼-- · 2020-08-19 00:54

在不设置登录信息的情况下预览报告,它会提示您缺少信息。

如果不起作用,请手动更新报告,然后 再次测试,然后将显示的内容与您设置的内容进行比较。

不要在代码中验证,不是必需的。

如何连接ODBC或OLE DB?

服务器名称属性应该是DSN名称或数据库服务器名称。

zhangjiyang1323
6楼-- · 2020-08-19 01:14

谢谢。 我已将更新后的程序发送给客户端,它似乎正在运行。

骆驼绵羊
7楼-- · 2020-08-19 01:06

这是OLEDB。

我将尝试其他项目,看看结果如何。

谢谢您的帮助。

埃里克。

一周热门 更多>