禁用TLS 1.0和1.1的Visual Studio Apps的CR

2020-08-20 14:03发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)我们有一个遗留应用程序,该应用程...

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

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


我们有一个遗留应用程序,该应用程序使用Visual Studio的Crystal报表(13.0.15.1840)。 当他们尝试禁用TLS 1.0登录时失败。 详细信息:[数据库供应商代码:18]文件temp_07f971e7-9796-410b-9351-354114d1f1b9 3588_1120_ {AE34A620-C4CE-41C7-933D-59E0DEE7C0BD} .rpt中的错误:无法连接:错误的登录参数。 详细信息:[CrystalDecisions.ReportAppServer.Controllers.DatabaseControllerClass.SetTableLocation(ISCRTable CurTable,ISCRTable NewTable)的[数据库供应商代码:18]和报表无法访问的服务器上的CrystalDecisions.CrystalReports.Engine.Table.set_Location(String值)和1.1。 连接:

将dll本身升级到Visual Studio的最新Crystal报表并不能解决问题。 我们的怀疑是,我们需要以某种方式将其从使用OLEDB驱动程序更改为更新的MSOLEDBSQL,但是目前尚不清楚如何执行此操作。 我们似乎无法在代码中进行更改。 是否有一条简单的途径可以使这些旧式报告与TLS 1.2一起使用? 谢谢!

4条回答
Doze时光
2020-08-20 14:46

如果要在运行时从代码更改提供程序,则必须遍历报告中的所有表,并使用替换它们的连接信息 适当的信息(信息的全部)。 以下是样本方法,可用于用新的Microsoft SQL Server连接替换报表中的所有连接:

///<摘要>
        ///使用新的OLEDB连接参数更新给定Crystal Report中包含的所有表
        ///
        /// A <请参见Crystal Report的cref =" CrystalDecisions.CrystalReports.Engine.ReportDocument"/> 
        ///要使用的新服务器(数据源)
        ///要使用的新数据库(初始目录)
        ///新的OLEDB提供程序(请参阅备注)
        ///是否使用受信任的连接
        ///要使用的新用户ID 
        ///新用户的密码
        /// SQL Server OLEDB提供程序的一些有效值(注意:必须安装匹配的供应商组件 
///

///

OLEDBSQL
///
Microsoft SQL Server的旧版OLE DB提供程序
///
SQLNCLI11
///
SQL Native Client v11
///
MSOLEDBSQL
///
用于Microsoft SQL Server的最新OLE DB提供程序(如果在SQL Server上禁用了TLS 1.0/1.1,则使用此提供程序。)
///
内部静态无效ChangeOleDbConnectionInfo(ReportDocument reportDocument,字符串服务器,字符串数据库,字符串oledbProvider,布尔集成安全性,字符串userId,字符串密码) { //boMainPropertyBag:这些保存表ConnectionInfo对象的属性 var boMainPropertyBag = new PropertyBag(); //boInnerPropertyBag:这些保存QE_LogonProperties的属性 //在主属性包(boMainPropertyBag)中 var boInnerPropertyBag = new PropertyBag(); //设置boInnerPropertyBag的属性 boInnerPropertyBag.Add(" Application Intent"," READWRITE"); boInnerPropertyBag.Add("自动翻译"," -1"); boInnerPropertyBag.Add("连接超时"," 15"); boInnerPropertyBag.Add("数据源",服务器); boInnerPropertyBag.Add(" DataTypeCompatibility"," 0"); boInnerPropertyBag.Add("常规超时"," 0"); boInnerPropertyBag.Add("初始目录",数据库); boInnerPropertyBag.Add(" Integrated Security",IntegratedSecurity?" True":" False"); boInnerPropertyBag.Add("语言环境标识符"," 1033"); boInnerPropertyBag.Add(" MARS Connection"," 0"); boInnerPropertyBag.Add(" OLE DB Services"," -5"); boInnerPropertyBag.Add(" Provider",oledbProvider); boInnerPropertyBag.Add("可能时带有列排序规则的标签"," 0"); boInnerPropertyBag.Add("信任服务器证书"," 0"); boInnerPropertyBag.Add("使用DSN默认属性","假"); boInnerPropertyBag.Add("使用数据加密"," 0"); //设置boMainPropertyBag的属性 boMainPropertyBag.Add("数据库DLL"," crdb_ado.dll"); boMainPropertyBag.Add(" QE_DatabaseName",数据库); boMainPropertyBag.Add(" QE_DatabaseType"," OLE DB(ADO)"); //添加我们在boInnerPropertyBag对象中设置的QE_LogonProperties boMainPropertyBag.Add(" QE_LogonProperties",boInnerPropertyBag); boMainPropertyBag.Add(" QE_ServerDescription",服务器); boMainPropertyBag.Add(" QE_SQLDB"," True"); boMainPropertyBag.Add(" SSO Enabled"," False"); //创建一个新的ConnectionInfo对象 var boConnectionInfo =新的CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfo { //将数据库属性传递给连接信息对象 属性= boMainPropertyBag, //设置连接种类 种类= CrConnectionInfoKindEnum.crConnectionInfoKindCRQE }; 如果(!integratedSecurity) { boConnectionInfo.UserName = userId; boConnectionInfo.Password =密码; } //获取报告的数据库表集合 CrystalDecisions.ReportAppServer.DataDefModel.Tables boTables; boTables = reportDocument.ReportClientDocument.DatabaseController.Database.Tables; //对于报告中的每个表: //-设置表名称属性。 //-在报表中设置表格位置以使用新的修改后的表格 foreach(boTables中的CrystalDecisions.ReportAppServer.DataDefModel.Table表) { //创建一个新的数据库表来替换报表当前表。 var boTable =新的CrystalDecisions.ReportAppServer.DataDefModel.Table { //将连接信息传递给表 ConnectionInfo = boConnectionInfo, 名称= table.Name, QualifiedName = table.QualifiedName, 别名= table.Alias }; reportDocument.ReportClientDocument.DatabaseController.SetTableLocation(table,boTable); } //在添加新表之后验证数据库。 //确保在添加Command表或存储过程时该表正确更新。 reportDocument.VerifyDatabase(); }

示例调用:

 var reportDocument = new ReportDocument();
 reportDocument.Load(@" C:\ reports \ myreport.rpt");

 ChangeOleDbConnectionInfo(reportDocument," myserver"," mydatabase"," MSOLEDBSQL",false," myuser"," mypass");


 

一周热门 更多>