- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试从 OLEDBSQL
更改我的 Crystal Reports 的提供者至 MSOLEDBSQL
如 OLEDBSQL
不支持TLS 1.2
我的代码:
Private Sub ProcessReport()
Dim crxRpt As New CrystalDecisions.CrystalReports.Engine.ReportDocument
crxRpt.Load("D:\RND\Crystal Reports - Connector\CrystallReportConvertVB\SummaryReport.rpt")
ChangeOleDbConnectionInfo(crxRpt, "SERVER", "DBNAME", "MSOLEDBSQL", False, "USERID", "PASSWORD")
End Sub
Friend Shared Sub ChangeOleDbConnectionInfo(ByVal reportDocument As ReportDocument, ByVal server As String, ByVal database As String, ByVal oledbProvider As String, ByVal integratedSecurity As Boolean, ByVal userId As String, ByVal password As String)
Dim boMainPropertyBag = New NameValuePairs2()
Dim boInnerPropertyBag = New NameValuePairs2()
boInnerPropertyBag.Add(New NameValuePair2("Application Intent", "READWRITE"))
boInnerPropertyBag.Add(New NameValuePair2("Auto Translate", "-1"))
boInnerPropertyBag.Add(New NameValuePair2("Connect Timeout", "15"))
boInnerPropertyBag.Add(New NameValuePair2("Data Source", server))
boInnerPropertyBag.Add(New NameValuePair2("DataTypeCompatibility", "0"))
boInnerPropertyBag.Add(New NameValuePair2("General Timeout", "0"))
boInnerPropertyBag.Add(New NameValuePair2("Initial Catalog", database))
boInnerPropertyBag.Add(New NameValuePair2("Integrated Security", If(integratedSecurity, "True", "False")))
boInnerPropertyBag.Add(New NameValuePair2("Locale Identifier", "1033"))
boInnerPropertyBag.Add(New NameValuePair2("MARS Connection", "0"))
boInnerPropertyBag.Add(New NameValuePair2("OLE DB Services", "-5"))
boInnerPropertyBag.Add(New NameValuePair2("Provider", oledbProvider))
boInnerPropertyBag.Add(New NameValuePair2("Tag with column collation when possible", "0"))
boInnerPropertyBag.Add(New NameValuePair2("Trust Server Certificate", "0"))
boInnerPropertyBag.Add(New NameValuePair2("Use DSN Default Properties", "False"))
boInnerPropertyBag.Add(New NameValuePair2("Use Encryption for Data", "0"))
boMainPropertyBag.Add(New NameValuePair2("Database DLL", "crdb_ado.dll"))
boMainPropertyBag.Add(New NameValuePair2("QE_DatabaseName", database))
boMainPropertyBag.Add(New NameValuePair2("QE_DatabaseType", "OLE DB (ADO)"))
boMainPropertyBag.Add(New NameValuePair2("QE_LogonProperties", boInnerPropertyBag))
boMainPropertyBag.Add(New NameValuePair2("QE_ServerDescription", server))
boMainPropertyBag.Add(New NameValuePair2("QE_SQLDB", "True"))
boMainPropertyBag.Add(New NameValuePair2("SSO Enabled", "False"))
Dim conAttributes As New CrystalDecisions.Shared.DbConnectionAttributes()
conAttributes.Collection = boMainPropertyBag
Dim boConnectionInfo = New ConnectionInfo With {
.Attributes = conAttributes,
.DatabaseName = database,
.ServerName = server
}
If Not integratedSecurity Then
boConnectionInfo.UserID = userId
boConnectionInfo.Password = password
End If
Dim myTables As CrystalDecisions.CrystalReports.Engine.Tables = reportDocument.Database.Tables
For Each myTable As CrystalDecisions.CrystalReports.Engine.Table In reportDocument.Database.Tables
Dim myTableLogonInfo As CrystalDecisions.Shared.TableLogOnInfo = myTable.LogOnInfo
myTableLogonInfo.ConnectionInfo.Attributes.Collection.Clear()
myTableLogonInfo.ConnectionInfo.Attributes = boConnectionInfo.Attributes
Next
Dim mySections As CrystalDecisions.CrystalReports.Engine.Sections = reportDocument.ReportDefinition.Sections
For Each mySection As CrystalDecisions.CrystalReports.Engine.Section In mySections
Dim myReportObjects As CrystalDecisions.CrystalReports.Engine.ReportObjects = mySection.ReportObjects
For Each myReportObject As CrystalDecisions.CrystalReports.Engine.ReportObject In myReportObjects
If myReportObject.Kind = CrystalDecisions.Shared.ReportObjectKind.SubreportObject Then
Dim mySubreportObject As CrystalDecisions.CrystalReports.Engine.SubreportObject = CType(myReportObject, CrystalDecisions.CrystalReports.Engine.SubreportObject)
Dim subReportDocument As CrystalDecisions.CrystalReports.Engine.ReportDocument = mySubreportObject.OpenSubreport(mySubreportObject.SubreportName)
Dim mytablessub As CrystalDecisions.CrystalReports.Engine.Tables = subReportDocument.Database.Tables
For Each myTable As CrystalDecisions.CrystalReports.Engine.Table In mytablessub
Dim myTableLogonInfo As CrystalDecisions.Shared.TableLogOnInfo = myTable.LogOnInfo
myTableLogonInfo.ConnectionInfo.Attributes.Collection.Clear()
myTableLogonInfo.ConnectionInfo.Attributes = boConnectionInfo.Attributes
Next
End If
Next
Next
reportDocument.VerifyDatabase()
reportDocument.SaveAs("D:\RND\Crystal Reports - Connector\CrystallReportConvertVB\CrystallReportConvertVB\Rpt-changed3.rpt")
End Sub
我使用以下 Crystal 报表版本:
verifyDatabase()
或 refresh()
在 ReportDocument
将 provider 属性更改回原始属性。 ApplyLogOnInfo()
- 发现它只重置了用户名和密码,而不是提供者。调用此方法还会重置已更改的提供程序。 Not supported within subreports
Friend Shared Function ChangeOleDbConnectionInfoSubReports(ByVal reportDocument As ReportDocument, ByVal server As String, ByVal database As String, ByVal schema As String, ByVal oledbProvider As String, ByVal integratedSecurity As Boolean, ByVal userId As String, ByVal password As String) As ReportDocument
Dim boInnerPropertyBag = New PropertyBag()
boInnerPropertyBag.Add("Application Intent", "READWRITE")
boInnerPropertyBag.Add("Auto Translate", "-1")
boInnerPropertyBag.Add("Connect Timeout", "15")
boInnerPropertyBag.Add("Data Source", server)
boInnerPropertyBag.Add("DataTypeCompatibility", "0")
boInnerPropertyBag.Add("General Timeout", "0")
boInnerPropertyBag.Add("Initial Catalog", database)
boInnerPropertyBag.Add("Integrated Security", If(integratedSecurity, "True", "False"))
boInnerPropertyBag.Add("Locale Identifier", "1033")
boInnerPropertyBag.Add("MARS Connection", "0")
boInnerPropertyBag.Add("OLE DB Services", "-5")
boInnerPropertyBag.Add("Provider", oledbProvider)
boInnerPropertyBag.Add("Tag with column collation when possible", "0")
boInnerPropertyBag.Add("Trust Server Certificate", "0")
boInnerPropertyBag.Add("Use DSN Default Properties", "False")
boInnerPropertyBag.Add("Use Encryption for Data", "0")
Dim boMainPropertyBag = New PropertyBag()
boMainPropertyBag.Add("Database DLL", "crdb_ado.dll")
boMainPropertyBag.Add("QE_DatabaseName", database)
boMainPropertyBag.Add("QE_DatabaseType", "OLE DB (ADO)")
boMainPropertyBag.Add("QE_LogonProperties", boInnerPropertyBag)
boMainPropertyBag.Add("QE_ServerDescription", server)
boMainPropertyBag.Add("QE_SQLDB", "True")
boMainPropertyBag.Add("SSO Enabled", "False")
Dim boConnectionInfo = New CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfo With {
.Attributes = boMainPropertyBag,
.Kind = CrConnectionInfoKindEnum.crConnectionInfoKindCRQE
}
If Not integratedSecurity Then
boConnectionInfo.UserName = userId
boConnectionInfo.Password = password
End If
For Each subreport As ReportDocument In reportDocument.Subreports
For Each table As CrystalDecisions.ReportAppServer.DataDefModel.Table In reportDocument.ReportClientDocument.SubreportController.GetSubreportDatabase(subreport.Name).Tables
Dim boTable = New CrystalDecisions.ReportAppServer.DataDefModel.Table With {
.ConnectionInfo = boConnectionInfo,
.Name = table.Name,
.QualifiedName = schema & "." & table.Name,
.[Alias] = table.[Alias]
}
reportDocument.ReportClientDocument.SubreportController.SetTableLocation(subreport.Name, table, boTable)
Next
Next
reportDocument.VerifyDatabase()
Return reportDocument
End Function
经验教训
Noticed that, I can not update the driver if the installed CrystalReport Runtime does not match with the Visual studio references (I have taken the DLLs from some Nuget packages that are not official releases). ICouldn't make the code work with Crystal Reports 10.5.3700 that I usedand I updated the runtime to 13.0.2000 (As per this article)
Crystal Reports also have tight rules with the processor architecture.Since I'm using a 32bit version, I have set all the settings in VisualStudio to compile the project as a 32bit app.
最佳答案
您可以通过循环遍历 ConnectionInfos
以编程方式替换报告的连接信息。并更换供应商。有一个(IMO hack-y)关于添加连接/驱动程序信息的解释here它引用了一个帮助编写数据库登录代码的 SAP KB,但文章中的链接已失效(相反,请使用 this one - 这对您的需求可能更有用)。
2020 年 7 月 7 日更新 (包括子报表处理)
// Add these using's (for readability in here):
using RasTables = CrystalDecisions.ReportAppServer.DataDefModel.Tables;
using RasTable = CrystalDecisions.ReportAppServer.DataDefModel.Table;
using RasConnectionInfo = CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfo;
// ...
/// <summary>
/// Updates all of the tables contained within the given Crystal Report with new OLEDB connection parameters
/// </summary>
/// <param name="reportDocument">A <see cref="CrystalDecisions.CrystalReports.Engine.ReportDocument"/> of the Crystal Report</param>
/// <param name="server">The new server (Data Source) to use</param>
/// <param name="database">The new database (Initial Catalog) to use</param>
/// <param name="oledbProvider">The new OLEDB provider (see remarks)</param>
/// <param name="integratedSecurity">Whether to use a trusted connection</param>
/// <param name="userId">The new user id to use</param>
/// <param name="password">The new user's password</param>
/// <remarks>Some valid values for a SQL Server OLEDB provider (note: matching vendor components <b>must</b> be installed)<br/>
/// <p>
/// <dt>OLEDBSQL</dt>
/// <dd>Legacy OLE DB provider for Microsoft SQL Server</dd>
/// <dt>SQLNCLI11</dt>
/// <dd>SQL Native Client v11</dd>
/// <dt>MSOLEDBSQL</dt>
/// <dd>latest OLE DB provider for Microsoft SQL Server (use this if TLS 1.0/1.1 are disabled on the SQL Server).</dd>
/// </remarks>
internal static void ChangeOleDbConnectionInfo(ReportDocument reportDocument, string server, string database,
string oledbProvider, bool integratedSecurity, string userId, string password)
{
// boMainPropertyBag: These hold the attributes of the tables ConnectionInfo object
var boMainPropertyBag = new PropertyBag();
// boInnerPropertyBag: These hold the attributes for the QE_LogonProperties
// In the main property bag (boMainPropertyBag)
var boInnerPropertyBag = new PropertyBag();
// Set the attributes for the boInnerPropertyBag
boInnerPropertyBag.Add("Application Intent", "READWRITE");
boInnerPropertyBag.Add("Auto Translate", "-1");
boInnerPropertyBag.Add("Connect Timeout", "15");
boInnerPropertyBag.Add("Data Source", server);
boInnerPropertyBag.Add("DataTypeCompatibility", "0");
boInnerPropertyBag.Add("General Timeout", "0");
boInnerPropertyBag.Add("Initial Catalog", database);
boInnerPropertyBag.Add("Integrated Security", integratedSecurity ? "True" : "False");
boInnerPropertyBag.Add("Locale Identifier", "1033");
boInnerPropertyBag.Add("MARS Connection", "0");
boInnerPropertyBag.Add("OLE DB Services", "-5");
boInnerPropertyBag.Add("Provider", oledbProvider);
boInnerPropertyBag.Add("Tag with column collation when possible", "0");
boInnerPropertyBag.Add("Trust Server Certificate", "0");
boInnerPropertyBag.Add("Use DSN Default Properties", "False");
boInnerPropertyBag.Add("Use Encryption for Data", "0");
// Set the attributes for the boMainPropertyBag
boMainPropertyBag.Add("Database DLL", "crdb_ado.dll");
boMainPropertyBag.Add("QE_DatabaseName", database);
boMainPropertyBag.Add("QE_DatabaseType", "OLE DB (ADO)");
// Add the QE_LogonProperties we set in the boInnerPropertyBag Object
boMainPropertyBag.Add("QE_LogonProperties", boInnerPropertyBag);
boMainPropertyBag.Add("QE_ServerDescription", server);
boMainPropertyBag.Add("QE_SQLDB", "True");
boMainPropertyBag.Add("SSO Enabled", "False");
// Create a new ConnectionInfo object
var boConnectionInfo = new RasConnectionInfo
{
// Pass the database properties to a connection info object
Attributes = boMainPropertyBag,
// Set the connection kind
Kind = CrConnectionInfoKindEnum.crConnectionInfoKindCRQE
};
if (!integratedSecurity)
{
boConnectionInfo.UserName = userId;
boConnectionInfo.Password = password;
}
// Local function will return a copy of the given table using the provided connection info
RasTable CreateBoTableCopy(RasTable originalTable, RasConnectionInfo connectionInfo)
{
// Create a new Database Table to replace the reports current table.
return new RasTable
{
// Pass the connection information to the table
ConnectionInfo = connectionInfo,
Name = originalTable.Name,
QualifiedName = originalTable.QualifiedName,
Alias = originalTable.Alias
};
}
var reportClientDocument = reportDocument.ReportClientDocument;
// Get the Database Tables Collection for your report
RasTables boTables = reportClientDocument.DatabaseController.Database.Tables;
// For each table in the report, set the report's table location to use a newly-modified
// copy of itself with the new connection info
foreach (RasTable table in boTables)
{
reportClientDocument.DatabaseController.SetTableLocation(table, CreateBoTableCopy(table, boConnectionInfo));
}
// Now drop this same science on all of the subreports
foreach (ReportDocument subreport in reportDocument.Subreports)
{
var subreportName = subreport.Name;
foreach (RasTable table in reportClientDocument.SubreportController.GetSubreportDatabase(subreportName).Tables)
{
reportClientDocument.SubreportController.SetTableLocation(subreportName, table, CreateBoTableCopy(table, boConnectionInfo));
}
}
// Verify the database after adding substituting the new table to ensure that the table
// updates properly when adding Command tables or Stored Procedures.
reportDocument.VerifyDatabase();
}
用法:
var newSqlProvider = "MSOLEDBSQL";
if (!string.IsNullOrWhiteSpace(overrideSqlProvider))
ChangeOleDbConnectionInfo(myReportDocument, newServerName, newDatabase, newSqlProvider, false, userName, userPassword);
关于c# - Crystal Reports - 将提供程序从 OLEDBSQL 更改为 MSOLEDBSQL 以通过代码支持 TLS 1.2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62038351/
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章详解dedecms后台编辑器将回车 改为 的方法由作者收集整理,如果你对
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 6 年前。 Improve th
不是将代码放在正文的头部或末尾(我把它放在正文的末尾),如果我将代码放在 JS 文件中而不是在 html 中它自己的脚本标记,是否可以? (我假设它像任何其他代码一样工作正常,但我问以防万一) 最佳答
我尝试执行从\e 命令编写的查询,但现在我无法执行任何查询,但可以在 PSQL 中执行命令。 现在我注意到这一点,我输入的命令现在在\e 中。 当我关闭\e(尝试运行它)时问题开始了。 最佳答案 ps
我有一个这样的字符串($ 字符总是被其他字符包围): a$b c$d e$f 我希望我的字符串方法在 $ 前面放置一个 \ 并删除换行符: a\$bc\$de\$f 我试过了,但它没有放入 \ 字符:
我需要使用 Java 构建一个 XML 文件。问题是我必须使用一些特殊字符,例如“ć”,然后在我的移动应用程序中读取它。 如果我手动更改 ć 就可以正常工作至 ć在我的 XML 文件中的记事
我有一个removeUser 页面,我在其中使用,然后使用submitForm() 函数进行错误处理。这段代码运行得非常好: export default function RemoveUserPag
我在数据库 “2048-05-21” 中有一个看起来像这样的日期 我只想得到年份,在这一年我只想得到两个后面的数字并将两个前面的数字更改为19 example: data : 2048-05-21 1
public class Venus1 { public static void main(String args[]) { int[]x={1,2,3};
我有以下 PHP 脚本,现在我需要在 JavaScript 中做同样的事情。 JavaScript 中是否有类似于 PHP 函数的函数,我已经搜索了好几天但找不到类似的东西?我想做的是计算某个单词在数
这个问题在这里已经有了答案: Is it bad practice to specify an array size using a variable instead of `#define` in
我陷入了一种情况,我必须通过“选中”工具栏中的复选框来“选中”列表中存在的所有复选框。 这是创建复选框列表的代码:- itemTpl: 'checked="checked" /> {groupName
我正在使用Python3。在分析一些网站时,我遇到了一些奇怪的字符并寻找解决方案。我找到了一个,但在找到解决方案之前,我尝试了一些方法,并且知道我无法重置它。当我使用 Jupyter 笔记本将列表 l
我在 http 下有 unity android app 和 site api 的工作基础设施。 最近换了服务器,申请了ssl证书。现在我的 api 在 https 下。 在 unity 应用程序中,
我在 http 下有 unity android app 和 site api 的工作基础设施。 最近换了服务器,申请了ssl证书。现在我的 api 在 https 下。 在 unity 应用程序中,
我在 Objective-C 中有一些代码。我想,我收到了 NSString 类型,但是当我尝试将它保存在核心数据中时,我得到了一个 user.clientID = clientID; 错误,例如:
在表中我有一个名为 CallTime 的字段 (Varchar)。 包括晚上8:00、晚上8:40、上午10:00等时间 我想将字段类型更改为“时间”并更新时间格式。该怎么做? 谢谢 最佳答案 UPD
这个问题在这里已经有了答案: C# - for Loop Freezes at strange intervals (3 个答案) 关闭 6 年前。 我试图解决 problem #14 from P
我今天在 Pycharm 社区版 5.0.3 中收到了这个错误,想知道这是否只是我做错了/没有意识到,或者是 PyCharm lint 问题。重现错误的代码是 mylist = list() # fi
我的目标是将数据库中的随机文本显示到网页上。首先,我不知道为什么我的数据没有保存,为什么我得到的是[Entity of type sec.helloweb.HelloMessage with id:
我是一名优秀的程序员,十分优秀!