Avviare un package di SSIS da un'applicazione ASP.NET

by Andrea 29 March 2010 07:22

SSIS Non so come mai, ma utlimamente mi scontro con problematiche non molto documentate. Una di queste è la possibilità di lanciare l'esecuzione di Package di SQL Server Integration Services da un'applicazione ASP.NET.

Cercando in rete, ho trovato solamente due possibili soluzioni, entrambe elencate in questo post. Una soluzione richiede la chiamata ad un job di SQL Server Agent, mentre l'altra soluzione fa uso di un Web Service da pubblicare nella macchina di SQL Server.

La prima soluzione l'ho scartata in quanto non sono riuscito a trovare il metodo per poter passare dei parametri utili a valorizzare le variabili del package (mia ignoranza). Mentre la seconda richiede di installare un'ulteriore applicazione (da dover poi mantenere e ripubblicare), nella macchina di SQL Server, e quindi anche questa scartata.
Può sembrare banale, ma avere un'applicazione in più da mantenere non è sempre semplice, specialmente nel caso l'applicazione sia distribuita in diversi server, e sia presente in casa di diversi clienti.

Guardando le diverse soluzioni, mi è venuta l'idea di provare a adattare la soluzione del Web Service, ma eseguita direttamente da un server remoto. Devo ammettere che ci sono state svariate problematiche, ma alla fine, sono arrivato ad una soluzione perfettamente funzionante.

Ecco come eseguire un package di SSIS da remoto:

Per l'esecuzione del package sarà necessario creare un utente nel database (oppure utilizzarne uno di esistente) ed assegnargli il ruolo db_dtsoperator nel database msdb. Questo ruolo attribuisce all'utente i permessi di:

  • Enumerate all packages.
  • View all packages.
  • Execute all packages.
  • Export all packages.
  • Execute all packages in SQL Server Agent.

Per quanto rigurda la connessione verso il database, nel web.config ho creato una ConnectionString che contiene solamente "Data Source", "User ID" e "Password", questo perchè poi tramite l'uso della classe DbConnectionStringBuilder, verrà poi parsata per recuperarne i singoli valori. Così ho un unico punto dove saranno contenute le credenziali di accesso.

   1: <add 
   2:   name="olapServerAuth"
   3:   connectionString="Data Source=192.168.0.100;User ID=usr;Password=p4$$w0rd;" 
   4:   providerName="System.Data.EntityClient" />

Nell'applicazione sarà necessario referenziare la dll Microsoft.SQLServer.ManagedDTS, e aggiungere alla classe uno using a Microsoft.SqlServer.Dts.Runtime.

Il codice per eseguire il package da remoto sarà il seguente:

   1: // recupero delle informazioni per l'autenticazione al server
   2: DbConnectionStringBuilder cs = new DbConnectionStringBuilder();
   3: cs.ConnectionString = ConfigurationManager.ConnectionStrings["olapServerAuth"].ConnectionString;
   4:  
   5: Application integrationServices = new Application();
   6: // recupero del package che deve essere presente in SQL Server
   7: Package package = integrationServices.LoadFromSqlServer(
   8:                         @"\Data Collector\Test\TestETL",
   9:                         cs["Data Source"] as string,
  10:                         cs["User ID"] as string,
  11:                         cs["Password"] as string,
  12:                         null);
  13:  
  14: // set delle variabili
  15: Variables variables = package.Variables;
  16: variables["VariabileDaSettare"].Value = valoreDaSettare;
  17:  
  18: // set delle connessioni
  19: Connections connections = package.Connections;
  20: connections["AdoNetAnalysisDatabase"].ConnectionString = ConfigurationManager.ConnectionStrings["AdoNetAnalysisDatabase"].ConnectionString;
  21:  
  22: // esecuzione del package
  23: DTSExecResult result = package.Execute(connections, variables, null, null, null);
  24: if (result != DTSExecResult.Success)
  25:     ... // errore nell'esecuzione
  26: else
  27:     ... // avvio corretto del package

Da notare che:

  • DbConnectionStringBuilder: permette di recuperare ogni singolo elemento che compone una ConnectionString. Utile in questo caso per salvare i dati del server di SQL Server, il nome dell'utente di accesso, e la relativa password in un unico container, e poterli poi recuperare singolarmente.
  • Application.LoadFromSqlServer: permette di recuperare un package presente in SQL Server. Se i campi username e password non vengono valorizzati, viene fatto uso della windows authentication.
  • package.Variables: recupero delle variabili utilizzate nel package. Utile nel caso sia necessario modificarne il valore di default prima dell'esecuzione.
  • package.Connections: recupero delle connessioni utilizzate nel package. Da notare che oltre alle stringhe di connessione, compaiono in questa lista anche le connessioni per i Flat File.
    In questi elementi devono essere presenti tutti i valori richiesti, come ad esempio nel caso di una connessione OLEDB dovranno essere presenti: Provider, Application Name e Auto Translate. (per facilità controllate come sono composte nel vostro package).
  • package.Execute: avvia l'esecuzione del package con le nuove variabili e connessioni impostate. 
  • In caso di non successo nell'esecuzione del package, in package.Errors saranno presenti gli errori.

Devo ammettere che ricostruire questo codice non è stato per niente facile, in quanto gli errori che mi si presentavano non erano proprio semplici da decifrare.
La maggiore difficoltà è stata nel capire che le connessioni dovevano riportare tutti i parametri (gli stessi che si possono vedere quando si esegue il package dal SQL Management Studio), ed infine anche il capire quali fossero i permessi minimi da dover dare all'utente per poter eseguire il tutto (per evitare problematiche di sicurezza).
Ma alla fine, tutto ha funzionato alla perfezione, e questo ripaga del tempo speso/investito in questa soluzione.

Tags: ,

SQL Server | ASP .NET | .NET

Codice e slide della sessione Write less do more...with jQuery

by Andrea 08 March 2010 01:35

Ecco disponibile per il download il codice e le slide della mia sessione "Write less do more...with jQuery" tenuta venerdì 5 Marzo 2010.

Tags: , ,

.NET | ASP .NET | Generale | XeDotNet

Prossimo evento - Rich Internet Applications Track

by Andrea 01 March 2010 02:00

Venerdì 5 Marzo 2010 ci sarà il community meeting "Rich Internet Applications Track" dove Andrea Boschin vi parlerà  di Silverlight 4.0, mentre il mio compito sarà quello di presentare jQuery, e il suo utilizzo con ASP.NET.

Silverlight 4.0 - Practical Overview

Il nuovo rilascio della recente beta di Silverlight 4.0 ha introdotto una serie di nuove feature che amplificano notevolmente le possibilità per lo sviluppatore. A partire dalle applicazioni Out of browser in full-trust, passando per il supporto a webcam e microfono, continuando con gli strumenti per la stampa e tutta una serie di interessanti novità, in questa sessione si vedranno le novità con una serie di esempi pratici calati su problematiche reali.

Write less do more...with jQuery

logo_jquery jQuery è un framework JavaScript che permette di semplificare la scrittura di codice JavaScript, facilitando l'iterazione con gli elementi della pagina (controlli, stili, eventi, animazioni, ...), e permettendo di aumentare la user experience delle applicazioni, riducendone al tempo stesso la complessità di scrittura. Vista la sua diffusione e potenza, è stato anche incluso nei project templete di Visual Studio. In questa sessione vedremo cos'è jQuery, e scopriremo le potenzialità e le funzionalità che offre, verificando se il motto "write less do more" sia vero o meno

Per l'iscrizione all'evento: registrazione

Tags: , , ,

ASP .NET | Internet

Linq to Facebook

by Andrea 28 January 2010 08:07

LinqToFacebook Visto la mia scoperta a riguardo di Linq to Twitter, mi sono chiesto se qualcuno avesse anche scritto un provider LINQ per Facebook, ed ecco che sempre da codeplex spunta il progetto LINQ to FQL, un provider di LINQ che si interfaccia direttamente con le API di Facebook.

Un articolo a riguardo di questa libreria lo trovate a questo link su codeproject:
Facebook Developer Toolkit LINQ to FQL Addon
mentre direttamente su CodeRun trovate il codice disponibile per testare subito la libreria:
CodeRun - LINQ to Facebook

Ed ecco un esempio di sintassi:

   1: var db = new FacebookDataContext();
   2: //LINQ Query Syntax
   3: var myUser = from user in db.user where user.uid == db.uid select user;
   4: //LINQ Method Syntax (the same query)
   5: var myUser2 = db.user.Where(t => t.uid == db.uid);

Una cosa che non condivido a pieno di questa libreria, è l'aver mantenuto gli stessi nomi degli oggetti e proprietà utilizzati da Facebook, mentre io avrei preferito fossero stati rinominati con qualcosa di più leggibile/parlante (e che rispetti le Naming Convention). Capisco altresì che uno sviluppatore, in questo modo, può utilizzare la stessa documentazione delle API di Facebook per capirne il significato e l'utilità.

Technorati Tags:

Tags: , ,

.NET | ASP .NET | Internet

Codice e slide della sessione Sviluppare con ASP.NET 4.0

by Andrea 10 December 2009 04:01

ASPNET_logo Ecco disponibile per il download il zip contenente codice e slide della mia sessione "Sviluppare con ASP.NET" tenuta al Community Tour 2009 a San Vito al Tagliamento il 4 dicembre 2009.

Ecco il link per il download.

Con le varie versioni del Microsoft .NET Framework, anche ASP.NET si è evoluto, e racchiude già un gran numero di funzionalità e tecnologie che coprono lo sviluppo in ambito web.In questa sessione capiremo i vantaggi che la prossima versione del Framewrok porterà con ASP.NET 4.0. La sessione non sarà solamente una carellata di nuove funzionalità, ma bensì sarà focalizzata su come la prossima release potrà aiutare lo sviluppatore nella realizzazione delle proprie applicazioni.

Le nuove funzionalità presenti in ASP.NET 4.0 le trovate elencate a questo link
ASP.NET 4 and Visual Studio 2010 Web Development Beta 2 Overview

Per qualsiasi domanda a riguardo, non esitate a contattarmi.

Tags: , , ,

XeDotNet | .NET | ASP .NET | Microsoft

Community Tour 2009

by Andrea 27 November 2009 03:19

Il 4 dicembre 2009, noi di XeDotNet in collaborazione con DotNetWorks e Powershell, ospiteremo a San Vito al Tagliamento una tappa del Community Tour 2009.

Gli argomenti che verranno trattati riguarderanno Windows 7, ed il Web, con le seguenti sessioni:

  • Windows 7 Developer Overview
    Speaker: Pietro Brambati – Microsoft Developer Evangelist
  • .NET Framework 4.0: Le novità per chi sviluppa Win Form e WPF
    Speaker: Alberto De Luca e Sabrina Cosolo – DotNetWork Founders & Community Lead.
  • Windows PowerShell 2.0: il prompt dei comandi nell'era di .NET e Windows 7
    Speaker: Efran Cobisi – Microsoft MCT & Powershell.it Community Lead
  • IIS 7.5: oltre il WEB server
    Speaker: Piergiorgio Malusardi – Microsoft IT Pro Evangelist
  • Windows Communication Foundation: normalizzare e controllare i servizi WCF
    Speaker: Davide Vernole - MVP Visual Developer ASP.NET
  • See the light... Silverlight 3.0!
    Speaker: Andrea Boschin - MVP Silverlight
  • Sviluppare con ASP.NET 4.0
    Speaker: Andrea Dottor - MVP Visual Developer ASP.NET

L'agenda completa è presente a questo link Agenda Community Tour 2009, mentre per registrarsi all'evento il link è il seguente Registrazione Community Tour 2009
LOCATION: Centro Direzionale Ponterosso - San Vito al Tagliamento (PN)
ORARIO: 08:45 - 17:30

Per quanto mi riguarda, terrò la sessione Sviluppare con ASP.NET 4.0 che riguarderà le novità presenti in ASP.NET 4.0, ed i vantaggi/migliorie che porteranno a noi sviluppatori (facilitandoci di molto la vita).

Con le varie versioni del Microsoft .NET Framework, anche ASP.NET si è evoluto, e racchiude già un gran numero di funzionalità e tecnologie che coprono lo sviluppo in ambito web.In questa sessione capiremo i vantaggi che la prossima versione del Framewrok porterà con ASP.NET 4.0. La sessione non sarà solamente una carellata di nuove funzionalità, ma bensì sarà focalizzata su come la prossima release potrà aiutare lo sviluppatore nella realizzazione delle proprie applicazioni.

Tags: , , ,

ASP .NET | Microsoft | XeDotNet

Microsoft MVP ASP.NET…rinnovato!!

by Andrea 01 October 2009 07:51

MVP_logo

Da pochi minuti ho ricevuto la conferma del mio rinnovo come Microsoft MVP ASP.NET.

E' il mio secondo award, e quindi il mio primo rinnovo…ma ho vissuto la giornata esattamente come un anno fa…in trepidante attesa di quella mail, che poteva anche non arrivare mai. E credetemi che è un'attesa infinita.

MVP Open Days 2009Sono veramente felice di essere stato rinnovato, perchè in quest'ultimo anno ho avuto modo di crescere ulteriormente grazie anche a questo premio e alle persone che il programma MVP riesce ad unire.

Un grazie sincero a tutte le persone che mi fanno capire quanto sono appassionato a questo mondo...da chi incontro agli eventi di XeDotNet, a chi scrive nei forum e nei newsgoup…in modi differenti, ma avete sempre stimolato la mia voglia di crescere e di diffondere quel poco che so. ;-)

Ma il più importante ringraziamento (doveroso) va a Maria Elena (la mia fidanzata), per la pazienza che ha nei miei confronti nel permettermi di seguire le mie innumerevoli attività ed impegni.

Grazie!!

Tags: , ,

Microsoft | +1 | .NET | ASP .NET

Guida BlogEngine.NET

by andrea 14 April 2009 00:25

guida_BlogEngine Segnalo che sono usciti i primi articoli della "Guida BlogEngine.NET" che ho scritto per HTML.it.

BlogEngine.NET è una piattaforma di blogging, la stessa che utilizzo io per questo blog (blog.dottor.net), e viste le numerose domande che ho ricevuto a riguardo dell'installazione, customizzazione ed integrazione/espansione, ho colto al volo la possibilità di scrivere questa guida, che spero possa essere utili a molti di voi. (e pensare che all'inizio si trattava di un unico articolo...)

BlogEngine_logo Ho fatto il possibile per rendere la guida il più semplice possibile, in modo da poter aiutare chi è alle prime armi con .NET, ma non solo. Nella guida, infatti, sono trattati anche argomenti sul come customizzare BlogEngine.NET con la propria grafica e sul cosa si deve fare per espandere l'applicazione aggiungendo delle proprie funzionalità (extensios), che secondo me, sono le grandi potenzialità di questa piattaforma. (che usciranno prossimamente)

Il link alla guida è il seguente "Guida BlogEngine.NET", e per qualunque domanda/critica potete contattarmi senza problemi.

Technorati Tags:

Tags: ,

ASP .NET | .NET | Microsoft

MultiHandleSliderExtender in un Templated Control

by Andrea 05 March 2009 05:18

Se provate a utilizzare un MultiHandleSliderExtender all'interno di una GridView, o di un Repeater o di un altro Templated Control, vi capiterà con una bella eccezione javascript (null is null or not an object) in quanto non l'extender non riesce a trovare i controlli impostati come MultiHandleSliderTarget.
Dando un'occhiata al file javascript di questo extender si può notare che il controllo esegue la funzione $get (recupera un elemento all'interno della pagina) usando come parametro l'id inserito, ma che nel caso di inserimento in un Templated Control, questo sarà differente dall'effettivo id utilizzato nella pagina (ClientID), sollevando quindi l'eccezione.

Per risolvere questo è sufficiente gestire l'evento RowDataBound (nel caso della GridView) e sostituire in ogni MultiHandleSliderTarget l'id dei controlli con i rispetti ClientID.

Ecco il codice necessario:

   1: protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
   2: {
   3:     if (e.Row.RowType == DataControlRowType.DataRow)
   4:     {
   5:         MultiHandleSliderExtender slider = e.Row.FindControl("multiHandleSliderExtenderTwo") as MultiHandleSliderExtender;
   6:         foreach (MultiHandleSliderTarget target in slider.MultiHandleSliderTargets)
   7:             target.ControlID = e.Row.FindControl(target.ControlID).ClientID; 
   8:     }
   9: }

Tags: , , , ,

.NET | ASP .NET | ASP.NET AJAX

Dynamic Data - Nascondere colonne in determinate action

by Andrea 19 December 2008 03:16

Nel visualizzare i dati nelle nostre applicazioni, spesso si ha la necessità di visualizzare un numero di informazioni differenti nel caso fossimo in una lista, o in un dettaglio o in edit di un nostro oggetto.

Lavorando con i Dynamic Data, di default la cosa non è possibile, ma con un pò di codice la cosa è fattibile.

Stephen Naughton ha trovato una soluzione davvero brillante, e cioè implementando l'interfaccia IAutoFieldGenrators (che viene utilizzata dalla GridView, e DetailsView per creare in automatico le colonne e/o fields), e creando un attributo da utilizzare nelle classi dei Metadati dove verranno specificate le action per le diverse property.

Il post è il seguente: Dynamic Data - Hiding Columns in selected PageTemplates

Tags: , , ,

ASP .NET