使用OLE DB(ADO)加密SQL Server连接的问题求助
问题解决:Crystal Reports加密连接配置及驱动报错处理
一、Crystal Reports 2016使用Microsoft OLE DB Driver 19报错的解决
报错信息:
Microsoft OLE DB Driver 19 for SQL Server - ADO Error Code 0x80040e73 Format of the initialization string does not conform to the OLE DB specification
解决步骤:
修正连接字符串格式
Microsoft OLE DB Driver 19(MSOLEDBSQL)的初始化字符串格式与旧版SQLOLEDB不同,需严格遵循规范。手动配置连接时,确保关键参数正确:Provider=MSOLEDBSQL;Data Source=your_server;Initial Catalog=your_db;User ID=your_user;Password=your_pass;Encrypt=yes;TrustServerCertificate=yes;注意:不要混用旧版参数,比如
Use Encryption for Data是SQLOLEDB的参数,MSOLEDBSQL使用Encrypt和TrustServerCertificate。确保Crystal Reports驱动兼容性
Crystal Reports 2016发布时,MSOLEDBSQL 19尚未推出,可能存在兼容性问题。可选择:- 降级使用Microsoft OLE DB Driver 18 for SQL Server(更稳定的兼容版本)
- 若坚持使用MSOLEDBSQL 19,需安装最新的Crystal Reports官方补丁,修复驱动适配问题。
替代方案:继续使用SQLOLEDB
既然添加encrypt=1和TrustServerCertificate=1后SQLOLEDB可正常连接,若无需MSOLEDBSQL的新特性,可继续使用该驱动,保持现有配置即可。
二、Visual Studio 2013 Web Viewer配置加密连接
针对现有代码的问题,以下是经过验证的正确配置方式:
方法:通过Property Bag正确配置OLE DB加密参数
修改原有ConnInfo配置部分,使用SQLOLEDB驱动并明确设置加密属性:
With ConnInfo .ServerName = lcServer .DatabaseName = IIf(ConfigurationSettings.AppSettings("Database") <> "", ConfigurationSettings.AppSettings("Database"), "zzzlive") .UserID = wjs.getDBUserName .Password = wjs.getDBUserPassword ' 构建连接属性包 Dim connectionProps As New PropertyBag() connectionProps.Add("Connect Timeout", "600") connectionProps.Add("Data Source", lcServer) connectionProps.Add("Initial Catalog", .DatabaseName) connectionProps.Add("Integrated Security", False) connectionProps.Add("Provider", "SQLOLEDB") connectionProps.Add("Use Encryption for Data", "1") ' SQLOLEDB启用加密 connectionProps.Add("Trust Server Certificate", "1") ' 信任自签名证书 ' 设置DbConnectionAttributes Dim dbAttrs As New DbConnectionAttributes() dbAttrs.Collection.Add(New NameValuePair2(DbConnectionAttributes.CONNINFO_DATABASE_DLL, DbConnectionAttributes.DATABASE_DLL_CRDB_ADOPLUS)) dbAttrs.Collection.Add(New NameValuePair2("QE_DatabaseType", "OLE DB (ADO)")) dbAttrs.Collection.Add(New NameValuePair2("QE_LogonProperties", connectionProps)) dbAttrs.Collection.Add(New NameValuePair2("QE_ServerDescription", lcServer)) dbAttrs.Collection.Add(New NameValuePair2("QE_SQLDB", "true")) .AllowCustomConnection = True .Attributes = dbAttrs .Type = ConnectionInfoType.CRQE End With ' 应用到主报表和子报表(原有循环逻辑保留,添加位置刷新) Dim cntli As TableLogOnInfo For Each cntable As CrystalDecisions.CrystalReports.Engine.Table In loReport.Database.Tables cntli = cntable.LogOnInfo cntli.ConnectionInfo = ConnInfo cntable.ApplyLogOnInfo(cntli) ' 强制更新表位置,确保属性生效 cntable.Location = .DatabaseName & ".dbo." & cntable.Location.Split(".").Last() Next For Each cnsection As Section In loReport.ReportDefinition.Sections For Each cnrepobject As ReportObject In cnsection.ReportObjects If cnrepobject.Kind = ReportObjectKind.SubreportObject Then Dim losubrep As SubreportObject = CType(cnrepobject, SubreportObject) Dim subrepdoc As ReportDocument = losubrep.OpenSubreport(losubrep.SubreportName) For Each cntable As CrystalDecisions.CrystalReports.Engine.Table In subrepdoc.Database.Tables cntli = cntable.LogOnInfo cntli.ConnectionInfo = ConnInfo cntable.ApplyLogOnInfo(cntli) cntable.Location = .DatabaseName & ".dbo." & cntable.Location.Split(".").Last() Next End If Next Next
关键说明:
- 对于SQLOLEDB驱动,使用
Use Encryption for Data=1和Trust Server Certificate=1参数,而非Encrypt和TrustServerCertificate(后者是MSOLEDBSQL的参数)。 - 添加
cntable.Location的更新,强制Crystal Reports刷新表连接信息,避免属性被忽略。 - 确保项目引用的Crystal Reports组件版本与VS2013兼容(推荐使用SAP Crystal Reports for Visual Studio 2013 SP21及以上版本,包含加密连接修复)。
内容的提问来源于stack exchange,提问作者Andy Summers
相关产品推荐
相关产品推荐

