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.
Hi,
I am not able to dowload utility from given location. it says that link is expired.
Could you please reupload that utility.
Thanks,
Vikas
Edited by: vikasJaigude on Nov 18, 2010 10:20 AM
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
What version of .NET? What version of CR?
BTW.; if you could create a new thread and reference the answered thread (such as this one) that would be great.
Ludek
Follow us on Twitter http://twitter.com/SAPCRNetSup
Got Enhancement ideas? Try the [SAP Idea Place|https://ideas.sap.com/community/products_and_solutions/crystalreports]
The file has been posted to:
Please give the server about 1/2 hour to finish the post.
I will see if I can get a permanent place for these files as nobody should need to go around asking like this. Apologies for that.
Happy coding,
Ludek
Yup. I created a KBase; [1553921 - Is there a utility that would help in writing database logon code?|http://www.sdn.sap.com/irj/servlet/prt/portal/prtroot/com.sap.km.cm.docs/oss_notes_boj/sdn_oss_boj_bi/sap(bD1lbiZjPTAwMQ==)/bc/bsp/spn/scn_bosap/notes%7B6163636573733d36393736354636443646363436353344333933393338323636393736354637333631373036453646373436353733354636453735364436323635373233443330333033303331333533353333333933323331%7D.do] that has the utility attached.
Apologies to all those that had to ask and hunt all everywhere (I should have created the KB in the 1st place).
Happy coding,
- Ludek
Edited by: Ludek Uher on Feb 16, 2011 6:58 AM
| 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.