OK, so let's try what, as I understand it, is the new way to go. It's best documented on Crystal's site
here[
^] and
here[
^], and you can also find good information in their help file "To change a persistent data source" (xi4_rassdk_net_dg_en.chm::/html/topic82.html, available
here[
^], if you don't have it).
The upshot is that you have to go at it a totally different route through a new library, replacing every existing connection in the report with new information. You should already have the new library, assuming you're using a full install of the Crystal components--if not, I'm pretty sure they're freely available in one of Crystal's SDKs. Add project references to CrystalDecisions.ReportAppServer.Controllers and CrystalDecisions.ReportAppServer.DataDefModel and then try something like the following:
Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.ReportAppServer
...
Dim rpt As New ReportDocument
RASReplaceCRConnection(rpt.ReportClientDocument, rpt.DataSourceConnections(0).Attributes)
...
Private Sub RASReplaceCRConnection(ByRef rcd As ClientDoc.ISCDReportClientDocument, atts As CrystalDecisions.Shared.DbConnectionAttributes)
Dim rpt As New CrystalDecisions.CrystalReports.Engine.ReportDocument
rcd.DatabaseController.LogonEx(yourServer, "", yourUser, yourPassword)
Dim QE_Details As New DataDefModel.PropertyBag
For Each nvp As CrystalDecisions.Shared.NameValuePair2 In atts.Collection
Select Case nvp.Name.ToString
Case "QE_ServerDescription"
QE_Details.Add(nvp.Name, yourServer)
Case "QE_LogonProperties"
Dim logonDetails As New DataDefModel.PropertyBag
For Each nvp2 As CrystalDecisions.Shared.NameValuePair2 In DirectCast(nvp.Value, CrystalDecisions.Shared.DbConnectionAttributes).Collection
Select Case nvp2.Name.ToString
Case "Data Source"
logonDetails.Add(nvp2.Name, yourServer)
Case Else
logonDetails.Add(nvp2.Name, nvp2.Value)
End Select
Next
QE_Details.Add(nvp.Name, logonDetails)
Case Else
QE_Details.Add(nvp.Name, nvp.Value)
End Select
Next
Dim newConnInfo As New DataDefModel.ConnectionInfo With {.Attributes = QE_Details,
.Kind = DataDefModel.CrConnectionInfoKindEnum.crConnectionInfoKindCRQE,
.UserName = yourUser,
.Password = yourPassword}
For Each oldConnInfo As DataDefModel.ConnectionInfo In rcd.DatabaseController.GetConnectionInfos
rcd.DatabaseController.ReplaceConnection(oldConnInfo, newConnInfo.Clone, Nothing, DataDefModel.CrDBOptionsEnum.crDBOptionDoNotVerifyDB)
Next
End Sub
Painful, but worked for me. Good luck!