Oggi, complice un pomeriggio un po' fiacco, ne ho approfittato per completare l'opera, ho definitivamente migrato tutte le applicazione che ho in sviluppo verso il fx 2.0 e VS2005, finalmente non ce la facevo più :-D
Fondamentalmente tutto e filato abbastanza liscio a parte qualche magagna con P/Invoke e naturalmente con il mio "amico" Crystal Report (maledetto lui...).
Per chiunque si trovasse di fronte alla stessa sistuazione e avesse un semplice metodo che imposta le fatidiche "ConnectionInfo" e "TableLogonInfo" al fine di poter switchare da un db ad un altro senza piangere in cinese... cominci a piangere perchè smette clamorosamente di funzionare... maledizione!
Quello che facevo fino ad oggi era "semplicemente" questo:
protected string ParseDBObjectName( string name )
{
if( name.IndexOf( " " ) != - 1 || name.IndexOf( "." ) != - 1 )
{
if( !name.StartsWith( "[" ) )
{
name = "[" + name;
}
if( !name.EndsWith( "[" ) )
{
name = name + "]"
}
}
return name;
}
protected void ApplyLogOnInfo( ReportDocument rpt, ConnectionInfo ci )
{
foreach(Table tb in rpt.Database.Tables)
{
TableLogOnInfo loi = tb.LogOnInfo;
loi.ConnectionInfo = ci;
tb.ApplyLogOnInfo( loi );
if( tb.TestConnectivity() )
{
if( tb.Location.IndexOf(".") > 0 )
{
tb.Location = this.ParseDBObjectName(
tb.Location.Substring(tb.Location.LastIndexOf( "." ) + 1 )
);
}
else
{
tb.Location = this.ParseDBObjectName( tb.Location );
}
}
}
}
public void ApplyLogOnInfo()
{
ConnectionInfo ci = new ConnectionInfo();
ci.ServerName = this.ServerName;
ci.DatabaseName = this.DatabaseName;
this.ApplyLogOnInfo( this.Report, ci );
foreach( ReportObject obj in this.Report.ReportDefinition.ReportObjects )
{
if( obj.Kind == ReportObjectKind.SubreportObject )
{
SubreportObject subObj = ( SubreportObject )obj;
ReportDocument subRpt = this.Report.OpenSubreport(
subObj.SubreportName );
this.ApplyLogOnInfo( subRpt, ci );
}
}
}
tutto ciò non fa altro che applicare in maniera ricorsiva su tutti gli oggetti (report e subreport) presenti nel report le stesse ConnectionInfo e TableLogonInfo, bene tutto ciò non funziona più, o meglio non produce il risultato atteso... all'inizio semplicemente panico... :-D
Poi studiando un po' il problema e i soliti comprensibilissimi errori di CR, ma questi alla versione 11 o quel che è non hanno ancora capito nulla..., sono giunto alla soluzione decisamente banale :-S
public void ApplyLogOnInfo()
{
ConnectionInfo ci = new ConnectionInfo();
ci.ServerName = this.ServerName;
ci.DatabaseName = this.DatabaseName;
ci.IntegratedSecurity = true;
è comparsa una nuova proprietà che non esisteva nella versione per il fx 1.1, naturalmente il suo valore di default, come mi sembra ovvio, è "false"...
Tutto è bene quel che finisce bene :-D
.m