Archive for the 'Programmazione' Category

Può capitare di dover eseguitre le repliche transazionali programmaticamente da una pagina asp.net o da un webservice .net (perchè? vari motivi :) )

Con SQL Server 2000 era un grosso problema perchè il database server non offriva particolari strumenti ma con la 2005 è tutto molto più semplice potento sfruttare direttamente gli assembly .NET che lo stesso SQL Server Management Studio usa per performare queste azioni.

I namespace da usare sono:
using Microsoft.SqlServer.Replication;
using Microsoft.SqlServer.Management.Common;

Cominciamo con avere la lista delle repliche transazionali attive sul database server: 

  1. DataSet subscriptions = null;
  2. using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
  3. {
  4.    ServerConnection serverConn = new ServerConnection(conn);
  5.    ReplicationMonitor monitor = new ReplicationMonitor(serverConn);
  6.    monitor.LoadProperties();
  7.    monitor.PublisherMonitors[0].LoadProperties();
  8.    subscriptions = monitor.PublisherMonitors[0].EnumSubscriptions(PublicationType.Transactional, SubscriptionResultOption.AllSubscriptions);
  9. }
  10. return subscriptions;

La classe ReplicationMonitor offre la possibilità di avere la lista delle repliche, come in questo caso, partendo dal Publisher server prendendo come esempio una Push Subscription installata sul Publisher stesso. Il metodo LoadProperties() è importantissimo e permette di popolare la collection PublisherMonitors.

Il metodo EnumSubscriptions torna un DataSet con una sola tabella popolato con le proprietà delle repliche transazionali disponibili. Di seguito le colonne “principali” che servono per eseguire una replica:
- publication: nome della replica
- subscriber: nome SQL del subscriber della replica
- subscriber_db: nome database a cui punta la replica
- last_distsync: data ultima replica
- status: stato della replica (enum ReplicationStatus)
- warning: avviso di stato della replica (enum ReplicationWarnings)

Per lanciare la replica:

  1. using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
  2. {
  3.   ServerConnection serverConn = new ServerConnection(conn);
  4.   TransSubscription s = new TransSubscription();
  5.   s.ConnectionContext = serverConn;
  6.   s.PublicationName = publicationName;
  7.   s.DatabaseName = s.ConnectionContext.DatabaseName;
  8.   s.SubscriberName = subscriberName;
  9.   s.SubscriptionDBName = subscriberDataBaseName;
  10.   s.ConnectionContext.Connect();
  11.   s.SynchronizeWithJob();
  12.   s.ConnectionContext.Disconnect();
  13. }

L’operazione è asincrona quindi è necessario aggiornare la lista delle repliche ogni 1-2 secondi (infatti neanche il Replication Monitor del Management Studio non da lo stato della replica in realtime).

Buona replica :D

Molto spesso è capitato che Visual Studio 2003 non riuscisse a compilare librerie referenziate oppure gli eseguibili windows e console application.

Il messaggio di errore è sempre questo: Could not copy temporary files to the output directory.

Ci sono vari motivi, tutti più o meno documentati:

- eseguibile ancora aperto
- DLL referenziato in uso
- eseguibile ancora in esecuzione ma non più visibile nella taskbar ma solo nel task manager
- impostazione “Copy Local” settato a false nel progetto libreria referenziato (basta metterlo a true)
- directory in read-only (per impostazione arbitraria del file system o il programma di controllo del codice sorgente locka la directory, mai mettere la “bin” sotto SourceSafe :D)
- dulcis in fundo, una cosa che non mi sarei mai aspettato e che ho scoperto con enorme stupore oggi, il programmino di protezione residente TeaTimer di SpyBot S&D che blocca gli eseguibili

Le motivazioni dei primi punti sono tutte legittime e valide e si possono risolvere facilmente: chiudere e riaprire visual studio, ripristinare i permessi di scrittura, impostare correttamente sourcesafe, passare da Debug a Release e ancora a Release, effettuare un Rebuild Project o Rebuild Solution

Per quanto riguarda SpyBot S&D, probabilmente il programmino riconosce l’exe compilato come una probabile minaccia. Basta chiuderlo e ricompilare normalmente e la compilazione andrà a buon fine.

Chi sviluppa in .NET con Visual Studio 2003 avrà avuto la necessità di effettuare del debug javascript… Finchè si usava Explorer 6 non c’erano grossi problemi, anzi, ho sempre considerato il debugging client di vs 2003 una manna dal cielo…

Installando Explorer 7 ho avuto una spiacevole sorpresa… Il debug js non funziona più e VS mi notifica questo simpatico messaggio “There is no source code available for the current location.”

Googlando a destra e a manca ho scoperto che è un bug noto e la stessa Microsoft sui forums di supporto ufficiali (nel novembre 2006) conosceva il problema e stava “lavorando per correggerlo”…

Esistono quattro workaround per questo problema:

- spostare il codice js da debuggare in un file esterno e includerlo nella pagina
- usare Microsoft Script Editor incluso nella suite di Office 2003
- richiedere a Microsoft una fix specifica documentata nella kb 930873 (solo con VS2003 SP1)
- usare il debug client di Visual Studio 2005

Magra consolazione.

Niente paura però, il debug js con Explorer 7 e Visual Studio 2005 funziona perfettamente.