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.