Cambiare connessione a runtime

martedì 08 febbraio 2011 - 14.15
Tag Elenco Tags  C#  |  .NET 3.5  |  Visual Studio 2008  |  SQL Server 2005  |  Access (.mdb)  |  Crystal Reports XI

LuchinoTO Profilo | Newbie

Ciao ragazzi,
credo che sicuramente qualcuno di voi si sarà già imbattuto nel mio problema.

Ho diversi report di crystal (alcuni su file .rpt altri "integrati"). In fase di progettazione utilizzo d'abitunine un database SQL Server,
ma la mia applicazione è strutturata per girare indifferentemente sia su Sql Server che su Ms Access.

Come posso modificare a run time la connessione dei report al database?
Avete esempi o link esaustivi sotto mano?

Grazie

DomA Profilo | Expert

Ciao,
quando apri un report lo devi comunque alimentare con i dati. Una cosa del genere:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Ora se costruisci diverse sub ognuna delle quali deputata ad aprire il report, ti basterà cambiare i dati della Connection String (quella riportata sopra è per access).
Spero di esser stato chiaro,


Domenico

LuchinoTO Profilo | Newbie

Grazie Domenico,
il tuo metodo è indubbiamente funzionante.
Il mio obiettivo, però, sarebbe quello di far connettere Crystal al database, in modo che si vada a recuperare i dati in completa autonomia.

E questo dovrebbe essere "facile", teoricamente, ma in pratica non lo è!!

Ad esempio, progetto un semplice report, in fase di progettazione utilizzo la connessione al mio db Sql Server.

A run time voglio che questo report si colleghi ad un database Access (che ovviamente ha il medesimo tracciato delle tabelle), non protetto da password.

Per far ciò utilizzo:

crReportDocument.Load(Application.StartupPath + "\\ListaOfferteAccess.rpt"); crConnectionInfo.ServerName = @"D:\Dati.mdb"; crConnectionInfo.DatabaseName = ""; crConnectionInfo.UserID = ""; crConnectionInfo.Password = ""; crDatabase = crReportDocument.Database; crTables = crDatabase.Tables; for (int i = 0; i < crTables.Count; i++) { crTable = crTables[i]; crTableLogOnInfo = crTable.LogOnInfo; crTableLogOnInfo.ConnectionInfo = crConnectionInfo; crTable.ApplyLogOnInfo(crTableLogOnInfo); } this.crystalReportViewer.ReportSource = crReportDocument;

Inutile dirti che non funziona, poiché mi compare costantemente una finestra in cui Crystal mi richiede i dati per l'accesso al DB.

Hai qualche idea?

LuchinoTO Profilo | Newbie

...finalmente ho risolto! Dopo varie "nottate" trascorse sul forum del sito SAP - Crystal Report

Se qualcuno avesse il mio stesso problema mi contatti pure, sarò lieto di illuminarlo!

freeteo Profilo | Guru

Ciao,
era un problema della proprietà "Location" per caso? Perchè ricordo qualcosa a riguardo quando si cambiano le impostazioni tramite LogonInfo...

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

LuchinoTO Profilo | Newbie

Non solo; il problema era legato all'impostazione dei driver da utilizzare a seconda che il database sia Access oppure SQL Server (fra l'altro l'impostazione del driver corretto è da specificare in modo "ripetuto" su proprietà differenti dell'oggetto report...)

Ciao

freeteo Profilo | Guru

Ok Luchino, se puoi fare un post di 2 righe con i passi che hai trovato per risolvere il problema sarebbe ottimo per chi si trovasse a passare di qua per un problema simile..
Grazie.

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

LuchinoTO Profilo | Newbie

Certo, io ho risolto così.

Per ciascun report (e per ogni eventuale subreport in esso contenuto) imposto varie proprietà su tutte le tabelle in esso contenute.

Principalmente mi sono costruito una classe statica di "utility" che richiamo sul report "principale".

public static void ConnettiReportADb(ReportDocument rpt) { ConnectionInfo cnnInfo = GetCrystalConnectionInfo(); foreach (Table table in rpt.Database.Tables) { TableLogOnInfo boTableLogOnInfo = (TableLogOnInfo)table.LogOnInfo.Clone(); boTableLogOnInfo.ConnectionInfo = cnnInfo; table.ApplyLogOnInfo(boTableLogOnInfo); } if (!rpt.IsSubreport) { foreach (ReportDocument subReport in rpt.Subreports) { ConnettiReportADb(subReport); } } }

questo invece è il codice del mio metodo privato "GetCrystalConnectionInfo"

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

DomA Profilo | Expert

Complimenti
Domenico
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5