Limitazione del componente "Web Service Task" - Integration Service
Il problema cui mi sono trovata di risolvere è stato quello di fruire di un servizio web messo a disposizione da un'altra azienda.
Per configurare il componente mi ha fornito il contratto (file wsdl), che segue le raccomandazioni del W3C, ma questo non è bastato per configurare il componente WebServiceTask preposto proprio per questo compito.
Se parto da un web service creato dalla mia macchina, usando un progetto microsoft e che in input richiede un parametro di tipo semplice come può essere una stringa o un float, tutto va a buon fine.
Se invece utilizzo il web service che richiede in input una lista di parametri in numero variabile e con tipologia complessa (es. struct {string, string, float}), la configurazione dello stesso si blocca alla selezione del metodo esposto, ma non permette di inserire i parametri di input.
Il problema l'ho risolto ma utilizzando la programmazione in VisualBasic attraverso il componente ScriptTask.Nello ScriptTask si sono aggiunti gli opportuni reference e il codice autogenerato da un'applicazione messa a disposizione da Microsoft "WSDL.exe" (vedi http://msdn2.microsoft.com/it-it/library/7h3ystb6(VS.80).aspx)
Esempio:
c:\> wsdl <path_wsdl> language:"VB"
Ma utilizzando questo componente si è persa tutta la facilità e la comodità del WebServiceTask, in più si deve eseguire tutta la gestione del salvataggio dell'output del service o attraverso l'uso di variabili all'interno del DTS o accodandole in un file nel caso anche la struttura dell'output sia strutturato in modo complesso e con un numero di item variabile.
Generazione di un Guid nell'ambito SSIS
Per l'uso di un campo GUID in una tabella è necessario
richiamare in fase di inserimento o update la funzione di SQL NewID() per avere la generazione dell'identificatore univoco,
Ma a volte non si vuole utilizzare appositamente un blocco SQL nel corso di un dataflow per questa operazione, quindi alternativamente si può passare attraverso
uno script sempre all'interno del dataflow, usando il seguente codice:
Dim gATD As System.Guid
gATD = System.Guid.NewGuid()
il quale dichiara un'oggetto di tipo System.Guid e lo istanzia attraverso la chiamata System.Guid.NewGuid().
Per assegnarlo poi alla colonna GUIDATD, dichiarata di tipo unique identifier [DT_GUID], si esegue
Row.GUIDATD = gATD
naturalmente in precedenza se Row.GUIDATD era fra le possibili colonne di input, si imposta la modalità READWRITE nella sezione Inputcolumn, altrimenti basta dichiararla con il giusto tipo tra le colonne di Output (unique identifier [DT_GUID]).
ciao ciao
Nota sul Mapping delle Variabili
oggi vorrei appuntare un piccolo problema che ho affrontato:
bisognava data una query tipo :
select Id, res from logfiles where namefile = ?
(usando una connessione tipo OLEDB )
si mappano le variabili in input nel seguente modo:
Var direction data_Type VarName
NomeFile INPUT VARCHAR 0
il Result Set invece è
ResultName Variablename
0 Id
1 Result
ATTENZIONE: l'indice dato alle variabili di ritorno riparte da 0 in quanto sono insiemi separati.
Inoltre la query è stata modificata nel seguente modo:
select CONVERT(INTEGER,Id) AS IDINT, res from logfiles where namefile = ?
in quanto i tipi disponibili per le variabili dell'SSIS è int32 o int16 e giù di lì,
mentre la colonna ID nel db è di tipo NUMERIC(18,0),
il cast in questo caso non è automatico, quindi necessita un'operazione del genere.
Angela