on ‎2010 Feb 09 8:40 AM
<p>
I would like to use the <b>same report for several data base providers</b> (ODBC, OLEDB SqlServer and OLEDB Oracle).<br />
My original report is designed with ODBC by another department. When I try to change the data base provider to Oracle or SqlServer I have an error at line:<br />
<br /></p>
<code>
//this line throw an exception if the report was not designed with the
same database provider.<br />
switch (provider)<br />
{<br />
case Provider.SqlServer:<br />
crTable.Location =
String.Format("{0}.dbo.", crConnectionInfo.DatabaseName, crTable.Name); //database.dbo.tablename<br /> break;<br /> case Provider.Oracle:<br /> crTable.Location = String.Format(".", crConnectionInfo.DatabaseName, crTable.Name);
//schema.tablename<br />
break;<br />
default:<br />
break;<br />
}</code>
<p>Even setting the same location, like this crTable.Location = crTable.Location; the code throws an exception.
I have to change the report schema location at runtime because we have several databases (SqlServer) or schemas (Oracle) and we have to use the same report.
I use Crystal Reports Version=12.0.2000.0</p>
<br />
Here is my complete code:<br />
<code>
private CrystalDecisions.Shared.ConnectionInfo FixDatabaseSqlServer()<br />
{<br />
CrystalDecisions.Shared.DbConnectionAttributes dbAttributes = new
DbConnectionAttributes();<br />
dbAttributes.Collection.Set("Server", this.ServerName.Text);<br />
dbAttributes.Collection.Set("Trusted_Connection", "false");<br />
dbAttributes.Collection.Set("Data Source", this.ServerName.Text);<br />
dbAttributes.Collection.Set("Initial Catalog", this.DatabaseName.Text);<br />
dbAttributes.Collection.Set("Integrated Security", "false");<br />
dbAttributes.Collection.Set("Provider", "SQLOLEDB");<br />
<br />
//setup the connection <br />
CrystalDecisions.Shared.ConnectionInfo crConnectionInfo = new ConnectionInfo();<br />
crConnectionInfo.DatabaseName = this.DatabaseName.Text;<br />
crConnectionInfo.ServerName = this.ServerName.Text;<br />
crConnectionInfo.UserID = this.UserID.Text;<br />
crConnectionInfo.Password = this.Password.Text;<br />
crConnectionInfo.IntegratedSecurity = false;<br />
crConnectionInfo.Attributes.Collection.Set("Database DLL", "crdb_ado.dll");<br />
crConnectionInfo.Attributes.Collection.Set("QE_DatabaseName",
this.DatabaseName.Text);<br />
crConnectionInfo.Attributes.Collection.Set("QE_DatabaseType", "OLE DB (ADO)");<br />
crConnectionInfo.Attributes.Collection.Set("QE_LogonProperties", dbAttributes);<br />
crConnectionInfo.Attributes.Collection.Set("QE_ServerDescription",
this.ServerName.Text);<br />
crConnectionInfo.Attributes.Collection.Set("QE_SQLDB", "True");<br />
crConnectionInfo.Attributes.Collection.Set("SSO Enabled", "False");<br />
crConnectionInfo.Type = CrystalDecisions.Shared.ConnectionInfoType.CRQE;<br />
crConnectionInfo.LogonProperties = dbAttributes.Collection;<br />
<br />
return (crConnectionInfo);<br />
}<br />
<br />
private CrystalDecisions.Shared.ConnectionInfo FixDatabaseOracle()<br />
{<br />
CrystalDecisions.Shared.DbConnectionAttributes dbAttributes = new
DbConnectionAttributes();<br />
dbAttributes.Collection.Set("Server", this.ServerName.Text);<br />
dbAttributes.Collection.Set("Trusted_Connection", "False");<br />
dbAttributes.Collection.Set("Data Source", this.ServerName.Text);<br />
dbAttributes.Collection.Set("Provider", "MSDAORA");<br />
<br />
//setup the connection <br />
CrystalDecisions.Shared.ConnectionInfo crConnectionInfo = new ConnectionInfo();<br />
crConnectionInfo.DatabaseName = "";<br />
crConnectionInfo.ServerName = this.ServerName.Text;<br />
crConnectionInfo.UserID = this.UserID.Text;<br />
crConnectionInfo.Password = this.Password.Text;<br />
crConnectionInfo.IntegratedSecurity = false;<br />
crConnectionInfo.Attributes.Collection.Set("Database DLL", "crdb_oracle.dll");<br />
crConnectionInfo.Attributes.Collection.Set("QE_DatabaseName", "");<br />
crConnectionInfo.Attributes.Collection.Set("QE_DatabaseType", "OLE DB (ADO)");<br />
crConnectionInfo.Attributes.Collection.Set("QE_LogonProperties", dbAttributes);<br />
crConnectionInfo.Attributes.Collection.Set("QE_ServerDescription",
this.ServerName.Text);<br />
crConnectionInfo.Attributes.Collection.Set("QE_SQLDB", "True");<br />
crConnectionInfo.Attributes.Collection.Set("SSO Enabled", "False");<br />
crConnectionInfo.Type = CrystalDecisions.Shared.ConnectionInfoType.CRQE;<br />
crConnectionInfo.LogonProperties = dbAttributes.Collection;<br />
<br />
return (crConnectionInfo);<br />
}<br />
<br />
private void FixDatabase(ReportDocument report, Provider provider)<br />
{<br />
bool setLocationError = false;<br />
string tableLocationPattern = String.Empty;<br />
CrystalDecisions.Shared.ConnectionInfo crConnectionInfo = null;<br />
<br />
switch (provider)<br />
{<br />
case Provider.SqlServer:<br />
crConnectionInfo = FixDatabaseSqlServer();<br />
tableLocationPattern = String.Format("{0}..", crConnectionInfo.DatabaseName, "");<br /> break;<br /> case Provider.Oracle:<br /> crConnectionInfo = FixDatabaseOracle();<br /> tableLocationPattern = String.Format(".", crConnectionInfo.UserID, "");<br /> break;<br /> <br /> case Provider.Undefinded:<br /> default:<br /> break;<br /> }<br /> <br /> //set database login information for the entire report object<br /> report.SetDatabaseLogon(crConnectionInfo.UserID, crConnectionInfo.Password, crConnectionInfo.ServerName, crConnectionInfo.DatabaseName);<br /> <br /> <br /> CrystalDecisions.CrystalReports.Engine.Database crDatabase = report.Database; //Set the CrDatabase Object to the Report's Database <br /> CrystalDecisions.CrystalReports.Engine.Tables crTables = crDatabase.Tables; //Set the CrTables object to the Tables collection of the Report's dDtabase<br /> <br /> foreach (CrystalDecisions.CrystalReports.Engine.Table crTable in crTables)<br /> {<br /> TableLogOnInfo crTableLogOnInfo = null;<br /> crTableLogOnInfo = crTable.LogOnInfo;<br /> if (crTableLogOnInfo != null)<br /> {<br /> crTableLogOnInfo.ConnectionInfo = crConnectionInfo;<br /> crTable.ApplyLogOnInfo(crTableLogOnInfo);<br /> <br /> //<br /> //Set location.<br /> //<br /> try<br /> {<br /> //this line throw an exception if the report was not designed with the same database provider.<br /> switch (provider)<br /> {<br /> case Provider.SqlServer:<br /> crTable.Location = String.Format(".dbo.", crConnectionInfo.DatabaseName, crTable.Name); //database.dbo.tablename<br /> break;<br /> case Provider.Oracle:<br /> crTable.Location = String.Format(".", crConnectionInfo.DatabaseName,
crTable.Name); //schema.tablename<br />
break;<br />
default:<br />
break;<br />
}<br />
crTable.Location = crTable.Location;<br />
<br />
}<br />
catch (Exception ex)<br />
{<br />
setLocationError = true;<br />
//throw;<br />
}<br />
crTable.TestConnectivity();<br />
}<br />
}<br />
<br />
//call this method recursively for each subreport<br />
foreach (ReportObject reportObject in report.ReportDefinition.ReportObjects)<br />
{<br />
if (reportObject.Kind == ReportObjectKind.SubreportObject)<br />
{<br />
FixDatabase(report.OpenSubreport(((SubreportObject)reportObject).SubreportName),
provider);<br />
}<br />
}<br />
}
</code>
<p>
I tried everything I found at forums with no success.<br />
Please, Is there anyone with the same problem who had solved it?
Is it possible to have the same report and several database providers?
<br />
What have do I have to do?
Thank you very much.</p>
Edited by: jporcar on Feb 9, 2010 9:41 AM
Request clarification before answering.
<p>
We have several unresolved difficultties with Oracle using the code below supplied by SAP.<br />
But I hope it helps.
</p>
<p>
<strong>Access</strong><br />
<code>
//Add these required Crystal Assemblies to your project<br />
//CrystalDecisions.ReportAppServer.DataDefModel<br />
//CrystalDecisions.ReportAppServer.ClientDoc<br />
//CrystalDecisions.ReportAppServer.Controllers<br />
//CrystalDecisions.CrystalReports.Engine<br />
//CrystalDecisions.Shared<br />
<br />
//Add these Crystal Assemblies to the top of your code page<br />
using CrystalDecisions.ReportAppServer.DataDefModel;<br />
using CrystalDecisions.CrystalReports.Engine;<br />
using CrystalDecisions.Shared;<br />
<br />
private ReportDocument ChangeConnectionInfo()<br />
{<br />
ReportDocument boReportDocument = new ReportDocument();<br />
//*EDIT* Change the path and report name to the report you want to change.<br />
boReportDocument.Load(@"c:\reports\yourreport.rpt",
OpenReportMethod.OpenReportByTempCopy);<br />
<br />
//Create a new Database Table to replace the reports current table.<br />
CrystalDecisions.ReportAppServer.DataDefModel.Table boTable = <br />
new CrystalDecisions.ReportAppServer.DataDefModel.Table();<br />
<br />
//boMainPropertyBag: These hold the attributes of the tables ConnectionInfo
object<br />
PropertyBag boMainPropertyBag = new PropertyBag();<br />
//boInnerPropertyBag: These hold the attributes for the QE_LogonProperties<br />
//In the main property bag (boMainPropertyBag)<br />
PropertyBag boInnerPropertyBag = new PropertyBag();<br />
<br />
//Set the attributes for the boInnerPropertyBag<br />
boInnerPropertyBag.Add("Data Source",
@"your_data_base.accdb");<br />
boInnerPropertyBag.Add("Locale Identifier", "1033");<br />
boInnerPropertyBag.Add("Office Database Type", "Access");<br />
boInnerPropertyBag.Add("OLE DB Services", "-6");<br />
boInnerPropertyBag.Add("Provider", "Microsoft.ACE.OLEDB.12.0");<br />
boInnerPropertyBag.Add("Use DSN Default Properties", "False");<br />
<br />
//Set the attributes for the boMainPropertyBag<br />
boMainPropertyBag.Add("Database DLL", "crdb_ado.dll");<br />
boMainPropertyBag.Add("QE_DatabaseName", "");<br />
boMainPropertyBag.Add("QE_DatabaseType", "OLE DB (ADO)");<br />
//Add the QE_LogonProperties we set in the boInnerPropertyBag Object<br />
boMainPropertyBag.Add("QE_LogonProperties", boInnerPropertyBag);<br />
boMainPropertyBag.Add("QE_ServerDescription",
@"
Xaloc\epsilonnet\Dietario\Datos\DatosConfig.accdb");<br />
boMainPropertyBag.Add("QE_SQLDB", "True");<br />
boMainPropertyBag.Add("SSO Enabled", "False");<br />
<br />
//Create a new ConnectionInfo object<br />
CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfo boConnectionInfo =
<br />
new CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfo();<br />
//Pass the database properties to a connection info object<br />
boConnectionInfo.Attributes = boMainPropertyBag;<br />
//Set the connection kind<br />
boConnectionInfo.Kind = CrConnectionInfoKindEnum.crConnectionInfoKindCRQE;<br />
//*EDIT* Set the User Name and Password if required.<br />
boConnectionInfo.UserName = "UserName";<br />
boConnectionInfo.Password = "Password";<br />
//Pass the connection information to the table<br />
boTable.ConnectionInfo = boConnectionInfo;<br />
<br />
//Get the Database Tables Collection for your report<br />
CrystalDecisions.ReportAppServer.DataDefModel.Tables boTables;<br />
boTables =
boReportDocument.ReportClientDocument.DatabaseController.Database.Tables;<br />
<br />
//For each table in the report:<br />
// - Set the Table Name properties.<br />
// - Set the table location in the report to use the new modified table<br />
boTable.Name = "TABLE1";<br />
boTable.QualifiedName = "TABLE1";<br />
boTable.Alias = "TABLE1";<br />
<br />
boReportDocument.ReportClientDocument.DatabaseController.SetTableLocation(boTables[0],
boTable);<br />
<br />
//Verify the database after adding substituting the new table.<br />
//To ensure that the table updates properly when adding Command tables or Stored
Procedures.<br />
boReportDocument.VerifyDatabase();<br />
<br />
return boReportDocument;<br />
}</code></p>
<p>
<strong>SqlServer</strong><br />
<code>
//Add these required Crystal Assemblies to your project<br />
//CrystalDecisions.ReportAppServer.DataDefModel<br />
//CrystalDecisions.ReportAppServer.ClientDoc<br />
//CrystalDecisions.ReportAppServer.Controllers<br />
//CrystalDecisions.CrystalReports.Engine<br />
//CrystalDecisions.Shared<br />
<br />
//Add these Crystal Assemblies to the top of your code page<br />
using CrystalDecisions.ReportAppServer.DataDefModel;<br />
using CrystalDecisions.CrystalReports.Engine;<br />
using CrystalDecisions.Shared;<br />
<br />
private ReportDocument ChangeConnectionInfo()<br />
{<br />
ReportDocument boReportDocument = new ReportDocument();<br />
//*EDIT* Change the path and report name to the report you want to change.<br />
boReportDocument.Load(@"c:\reports\yourreport.rpt",
OpenReportMethod.OpenReportByTempCopy);<br />
<br />
//Create a new Database Table to replace the reports current table.<br />
CrystalDecisions.ReportAppServer.DataDefModel.Table boTable = <br />
new CrystalDecisions.ReportAppServer.DataDefModel.Table();<br />
<br />
//boMainPropertyBag: These hold the attributes of the tables ConnectionInfo
object<br />
PropertyBag boMainPropertyBag = new PropertyBag();<br />
//boInnerPropertyBag: These hold the attributes for the QE_LogonProperties<br />
//In the main property bag (boMainPropertyBag)<br />
PropertyBag boInnerPropertyBag = new PropertyBag();<br />
<br />
//Set the attributes for the boInnerPropertyBag<br />
boInnerPropertyBag.Add("Auto Translate", "-1");<br />
boInnerPropertyBag.Add("Connect Timeout", "15");<br />
boInnerPropertyBag.Add("Data Source", "localhost");<br />
boInnerPropertyBag.Add("General Timeout", "0");<br />
boInnerPropertyBag.Add("Initial Catalog", "your_data_base");<br />
boInnerPropertyBag.Add("Integrated Security", "True");<br />
boInnerPropertyBag.Add("Locale Identifier", "3082");<br />
boInnerPropertyBag.Add("OLE DB Services", "-5");<br />
boInnerPropertyBag.Add("Provider", "SQLOLEDB");<br />
boInnerPropertyBag.Add("Tag with column collation when possible", "0");<br />
boInnerPropertyBag.Add("Use DSN Default Properties", "False");<br />
boInnerPropertyBag.Add("Use Encryption for Data", "0");<br />
<br />
//Set the attributes for the boMainPropertyBag<br />
boMainPropertyBag.Add("Database DLL", "crdb_ado.dll");<br />
boMainPropertyBag.Add("QE_DatabaseName", "your_data_base");<br />
boMainPropertyBag.Add("QE_DatabaseType", "OLE DB (ADO)");<br />
//Add the QE_LogonProperties we set in the boInnerPropertyBag Object<br />
boMainPropertyBag.Add("QE_LogonProperties", boInnerPropertyBag);<br />
boMainPropertyBag.Add("QE_ServerDescription", "localhost");<br />
boMainPropertyBag.Add("QE_SQLDB", "True");<br />
boMainPropertyBag.Add("SSO Enabled", "False");<br />
<br />
//Create a new ConnectionInfo object<br />
CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfo boConnectionInfo =
<br />
new CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfo();<br />
//Pass the database properties to a connection info object<br />
boConnectionInfo.Attributes = boMainPropertyBag;<br />
//Set the connection kind<br />
boConnectionInfo.Kind = CrConnectionInfoKindEnum.crConnectionInfoKindCRQE;<br />
//*EDIT* Set the User Name and Password if required.<br />
boConnectionInfo.UserName = "UserName";<br />
boConnectionInfo.Password = "Password";<br />
//Pass the connection information to the table<br />
boTable.ConnectionInfo = boConnectionInfo;<br />
<br />
//Get the Database Tables Collection for your report<br />
CrystalDecisions.ReportAppServer.DataDefModel.Tables boTables;<br />
boTables =
boReportDocument.ReportClientDocument.DatabaseController.Database.Tables;<br />
<br />
//For each table in the report:<br />
// - Set the Table Name properties.<br />
// - Set the table location in the report to use the new modified table<br />
boTable.Name = "TABLE1";<br />
boTable.QualifiedName = "your_data_base.dbo.TABLE1";<br />
boTable.Alias = "TABLE1";<br />
<br />
boReportDocument.ReportClientDocument.DatabaseController.SetTableLocation(boTables[0],
boTable);<br />
<br />
//Verify the database after adding substituting the new table.<br />
//To ensure that the table updates properly when adding Command tables or Stored
Procedures.<br />
boReportDocument.VerifyDatabase();<br />
<br />
return boReportDocument;<br />
}<br />
</code>
</p>
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
| User | Count |
|---|---|
| 8 | |
| 5 | |
| 4 | |
| 4 | |
| 3 | |
| 3 | |
| 2 | |
| 2 | |
| 2 | |
| 2 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.