C#从一个Oracle ODBC迁移到另一个

2020-09-01 19:02发布

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

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


我已经在很多帮助下获得了ODBC的更新,以使基于SQL Server的报表能够正常工作,但是现在我试图弄清楚Oracle DB的状况,因为它对我不起作用。 似乎在" VerifyDatabase"处失败,据我了解可能会导致问题。 我确实删除了该行并进行了测试,这使连接的别名留为空白,这远不理想。

请帮助我弄清楚如何修复代码,以便可以同时将其用于Oracle和SQL Server。

 ReportDocument rpt = new ReportDocument();
 rpt.Load(rptSourceURL);


 ISCDReportClientDocument rptClientDoc = rpt.ReportClientDocument;


//为两个现有参数值设置参数值。
//rpt.SetParameterValue(" servProvCode"," ab");
//rpt.SetParameterValue(" servProvCode2"," cd");
 如果(rpt.ReportClientDocument.DataDefController.DataDefinition.ParameterFields.Count> 0)
 {
 foreach(rptClientDoc.DataDefController.DataDefinition.ParameterFields中的CrystalDecisions.ReportAppServer.DataDefModel.ParameterField参数字段)
 {
//MessageBox.Show(paramfield.Type.ToString());
 如果(paramfield.Type.ToString()==" crFieldValueTypeStringField")
 {
 rpt.SetParameterValue(paramfield.Name," ABC");
 }
 否则,如果(paramfield.Type.ToString()==" crFieldValueTypeDateField")
 {
 rpt.SetParameterValue(paramfield.Name," 01/01/2000");
 }
 其他
 {
 rpt.SetParameterValue(paramfield.Name," 123");
 }
 }
 }


//创建一个新的命令表来替换报告当前表。
 CrystalDecisions.ReportAppServer.DataDefModel.CommandTable boTable =新的CrystalDecisions.ReportAppServer.DataDefModel.CommandTable();
//获取报告的数据库表集合
 CrystalDecisions.ReportAppServer.DataDefModel.Tables boTables;
 boTables = rptClientDoc.DatabaseController.Database.Tables;


//设置新的属性包值,如果没有更改但仍然保留,则可能不需要


//boMainPropertyBag:这些保存表ConnectionInfo对象的属性
 PropertyBag boMainPropertyBag =新的PropertyBag();
//boInnerPropertyBag:这些保存QE_LogonProperties的属性
//在主属性包(boMainPropertyBag)中
 PropertyBag boInnerPropertyBag =新的PropertyBag();


//设置boInnerPropertyBag的属性
 boInnerPropertyBag.Add(" DSN",rptODBC);
 boInnerPropertyBag.Add(" Database",rptDatabase);
 boInnerPropertyBag.Add(" User ID",rptUser);
//boInnerPropertyBag.Add(" UseDSNProperties"," False");
 boInnerPropertyBag.Add("使用DSN默认属性","假");
 boInnerPropertyBag.Add("数据源名称",rptODBC);




//设置boMainPropertyBag的属性
 boMainPropertyBag.Add("数据库DLL"," crdb_odbc.dll");
 boMainPropertyBag.Add(" DSN",rptODBC);
 boMainPropertyBag.Add(" QE_ServerDescription",rptODBC);
 boMainPropertyBag.Add("数据源名称",rptODBC);
 boMainPropertyBag.Add(" QE_DataSourceName",rptODBC);
 boMainPropertyBag.Add(" QE_DatabaseName",rptDatabase);
 boMainPropertyBag.Add(" QE_DatabaseType"," ODBC(RDO)");
//添加我们在boInnerPropertyBag对象中设置的QE_LogonProperties
 boMainPropertyBag.Add(" QE_LogonProperties",boInnerPropertyBag);


 boMainPropertyBag.Add(" QE_SQLDB"," True");
 boMainPropertyBag.Add(" SSO Enabled"," False");


//创建一个新的ConnectionInfo对象
 CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfo boConnectionInfo =新的CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfo();
//将数据库属性传递给连接信息对象
 boConnectionInfo.Attributes = boMainPropertyBag;
//设置连接种类
 boConnectionInfo.Kind = CrConnectionInfoKindEnum.crConnectionInfoKindCRQE;
//**编辑**如果需要,设置用户名和密码。
 boConnectionInfo.UserName = rptUser;
 boConnectionInfo.Password = rptPassword;


//============================================
//更新"主要报告"表
//============================================
 for(int k = 0; k 

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

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


我已经在很多帮助下获得了ODBC的更新,以使基于SQL Server的报表能够正常工作,但是现在我试图弄清楚Oracle DB的状况,因为它对我不起作用。 似乎在" VerifyDatabase"处失败,据我了解可能会导致问题。 我确实删除了该行并进行了测试,这使连接的别名留为空白,这远不理想。

请帮助我弄清楚如何修复代码,以便可以同时将其用于Oracle和SQL Server。

 ReportDocument rpt = new ReportDocument();
 rpt.Load(rptSourceURL);


 ISCDReportClientDocument rptClientDoc = rpt.ReportClientDocument;


//为两个现有参数值设置参数值。
//rpt.SetParameterValue(" servProvCode"," ab");
//rpt.SetParameterValue(" servProvCode2"," cd");
 如果(rpt.ReportClientDocument.DataDefController.DataDefinition.ParameterFields.Count> 0)
 {
 foreach(rptClientDoc.DataDefController.DataDefinition.ParameterFields中的CrystalDecisions.ReportAppServer.DataDefModel.ParameterField参数字段)
 {
//MessageBox.Show(paramfield.Type.ToString());
 如果(paramfield.Type.ToString()==" crFieldValueTypeStringField")
 {
 rpt.SetParameterValue(paramfield.Name," ABC");
 }
 否则,如果(paramfield.Type.ToString()==" crFieldValueTypeDateField")
 {
 rpt.SetParameterValue(paramfield.Name," 01/01/2000");
 }
 其他
 {
 rpt.SetParameterValue(paramfield.Name," 123");
 }
 }
 }


//创建一个新的命令表来替换报告当前表。
 CrystalDecisions.ReportAppServer.DataDefModel.CommandTable boTable =新的CrystalDecisions.ReportAppServer.DataDefModel.CommandTable();
//获取报告的数据库表集合
 CrystalDecisions.ReportAppServer.DataDefModel.Tables boTables;
 boTables = rptClientDoc.DatabaseController.Database.Tables;


//设置新的属性包值,如果没有更改但仍然保留,则可能不需要


//boMainPropertyBag:这些保存表ConnectionInfo对象的属性
 PropertyBag boMainPropertyBag =新的PropertyBag();
//boInnerPropertyBag:这些保存QE_LogonProperties的属性
//在主属性包(boMainPropertyBag)中
 PropertyBag boInnerPropertyBag =新的PropertyBag();


//设置boInnerPropertyBag的属性
 boInnerPropertyBag.Add(" DSN",rptODBC);
 boInnerPropertyBag.Add(" Database",rptDatabase);
 boInnerPropertyBag.Add(" User ID",rptUser);
//boInnerPropertyBag.Add(" UseDSNProperties"," False");
 boInnerPropertyBag.Add("使用DSN默认属性","假");
 boInnerPropertyBag.Add("数据源名称",rptODBC);




//设置boMainPropertyBag的属性
 boMainPropertyBag.Add("数据库DLL"," crdb_odbc.dll");
 boMainPropertyBag.Add(" DSN",rptODBC);
 boMainPropertyBag.Add(" QE_ServerDescription",rptODBC);
 boMainPropertyBag.Add("数据源名称",rptODBC);
 boMainPropertyBag.Add(" QE_DataSourceName",rptODBC);
 boMainPropertyBag.Add(" QE_DatabaseName",rptDatabase);
 boMainPropertyBag.Add(" QE_DatabaseType"," ODBC(RDO)");
//添加我们在boInnerPropertyBag对象中设置的QE_LogonProperties
 boMainPropertyBag.Add(" QE_LogonProperties",boInnerPropertyBag);


 boMainPropertyBag.Add(" QE_SQLDB"," True");
 boMainPropertyBag.Add(" SSO Enabled"," False");


//创建一个新的ConnectionInfo对象
 CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfo boConnectionInfo =新的CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfo();
//将数据库属性传递给连接信息对象
 boConnectionInfo.Attributes = boMainPropertyBag;
//设置连接种类
 boConnectionInfo.Kind = CrConnectionInfoKindEnum.crConnectionInfoKindCRQE;
//**编辑**如果需要,设置用户名和密码。
 boConnectionInfo.UserName = rptUser;
 boConnectionInfo.Password = rptPassword;


//============================================
//更新"主要报告"表
//============================================
 for(int k = 0; k   
付费偷看设置
发送
3条回答
哎,真难
1楼 · 2020-09-01 19:42.采纳回答

是基于Oracle的报表还是SQL Server? 同时更改和修改Command SQL可能导致各种集合彼此不同步。

由于MS SQL和Oracle之间的SQL完全不同,因此您应该首先使用ReplaceConnection()。 然后在下一步中更改命令。 您可能需要先将报告另存为临时报告。

我们一直在将MS SQL报告转换为代码形式的Oracle时遇到问题。 最好使用基于Oracle的报表,然后简单地更新Command SQL。

使用它来提交更改,并且除非您需要,否则不要验证数据库,这确实会在出现问题时引起问题。 使用ReplaceConnection()。 表格必须完全匹配,因为CR在RTP文件中保留了表格结构的副本,验证DB只会混淆集合:

而不是使用SetTableLocation()来使用:

 oldConnInfos = rptClientDoc.DatabaseController.GetConnectionInfos(null); for(int I = 0; I  

首先克隆数据库属性,然后使用Clone()对象进行更改。

并添加代码以设置别名应修复对象名称。

黑丝骑士
2楼-- · 2020-09-01 19:51

上面的代码格式部分(不确认/否定答案只是对喜欢格式化代码的人进行代码更新。)

 oldConnInfos = rptClientDoc.DatabaseController.GetConnectionInfos(null);
 for(int I = 0; I                                                                     
lukcy2020
3楼-- · 2020-09-01 19:34

FYI crDBOptionDoNotVerifyDB也是应用程序和web.config文件的属性,用于全局设置。

一周热门 更多>