Aiuto per DTSX

lunedì 07 marzo 2011 - 17.09
Tag Elenco Tags  Visual Studio 2005  |  SQL Server 2005

mcfede88 Profilo | Newbie

Salve a tutti, adesso sono passato a DTSX un pò più complicati,
in pratica il giro che dovrei fare è:
Decompimere cartella e controllare i file presenti (ho fatto un programmino in C#) --> se i file sono 5 devo fare l'importazione (da txt a tabella) per tutti e 5, se invece sono 3 devo farlo per tutti e 3 e scrivere in un log il file che manca.

Qualcosa mi saprebbe dare un'idea di quali strumenti di usare (uso VS 2005)?

alx_81 Profilo | Guru

>Salve a tutti,
ciao

>adesso sono passato a DTSX un pò più complicati,
no dai, io li ho trovati molto più intuitivi e migliori nell'implementazione affidabile (vedi i tipi di dato e le logiche separate control e data flow)

>Decompimere cartella e controllare i file presenti (ho fatto un programmino in C#)
necessario il programma oppure ti basterebbe la linea di comando di uno zip generico?

>se i file sono 5 devo fare l'importazione (da txt a tabella) per tutti e 5,
>se invece sono 3 devo farlo per tutti e 3 e scrivere in un log il file che manca.
>Qualcosa mi saprebbe dare un'idea di quali strumenti di usare (uso VS 2005)?
Perfetto, allora, ti consiglio di seguire questa strada:
uno Script Task che usando System.IO va a controllare la count dei file sulla cartella.
Per fare bene le cose, crea una variabile che contiene il path fisico su cui controllare e passala in readonly allo script.
In base al fatto che il conteggio sia 5 o 3 valorizzi una variabile (o n, in base ai tuoi casi) che poi sarà la sorgente di un'espressione sul constraint di successo che si diparte dallo script task.
In questo modo, per ogni espressione che si verifica si esegue un ramo in particolare, uno dei quali farà l'import ciclico tramite foreach sul path e sui file (ogni ciclo avrà un data flow con sorgente flat file e destinazione tabella) e l'altro farà il log (forse avrai bisogno di un ulteriore Script Task).

Prova a partire, altrimenti, se proprio non ci salti fuori, passami il formato dei 5 file (sono fatti uguali?) e quello del log che vorresti, possiamo provare ad ideare una soluzione demo.

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

mcfede88 Profilo | Newbie

Nella giornata di domani proverò a farlo,
una cosa che non mi è chiara è questa:
Io nel caso ottimale dovrei avere 5 file di testo tutti dello stesso formato ma con dati diversi,
i nomi possono essere questi: Villaggi.txt, Affittacamere.txt, Residence.txt, Ville.txt, Appartamenti.txt

Quindi io dovrei avere un solo data-flow task all'interno del contenitore for-each con sorgente flat e destinazione tabella, ma come faccio a passare i nomi dei file presenti all'interno della cartella al sorgente flat?

Mi spiego meglio, se al posto del caso ottimale mi si presentano solo 3 dei file come faccio a passare al sorgente flat i nomi dei file presenti all'interno?


Grazie mille sempre gentilissimo

mcfede88 Profilo | Newbie

Ciao a tutti, ho scritto questo codice, solo che non ho capito dove inserirlo all'interno del componente Attività di Scripting:
Imports System Imports System.Data Imports System.Math Imports Microsoft.SqlServer.Dts.Runtime Imports System.IO Public Class ScriptMain Public Sub Main() Dim dir As String() = Directory.GetFiles("C:\") Dim numero As Integer = dir.Length If (Dts.Variables.Contains("NummmFile")) Then Dts.TaskResult = Dts.Results.Failure End If numero = CInt(Dts.Variables("NumFile").Value) Console.WriteLine(numero) Dts.TaskResult = Dts.Results.Success End Sub End Class

Grazie a tutti

alx_81 Profilo | Guru

>Quindi io dovrei avere un solo data-flow task all'interno del contenitore for-each con
>sorgente flat e destinazione tabella, ma come faccio a passare i nomi dei file
>presenti all'interno della cartella al sorgente flat?
il foreach cicla sui nomi dei file che rispettano un pattern in una cartella. Basta usare l'enumeratore file.

>Mi spiego meglio, se al posto del caso ottimale mi si presentano solo 3 dei file
>come faccio a passare al sorgente flat i nomi dei file presenti all'interno?
eh in quel caso dovrai usare script per leggere il contenuto di ogni file, facendo o un altro foreach (identico all'altro) oppure un cliclo nello script.

Il codice invece non l'ho capito..

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

mcfede88 Profilo | Newbie

Allora ho fatto il primo script che mi dovrebbe restituire l'enumeratore,
ho dichiarato all'esterno nelle variabili una variabile chiamata NumFile di tipo Int32, fatto lo script che sopra ho esposto a quanto ho capito
nelle espressione dello Script Task creo una espressione con proprietà ReadOnlyVariables e relativa espressione = @[Utente::For]

Solo che mi da questo errore: impossibile convertire 'System.Int32' in 'System.String'

Le mie domande sono due: sto facendo bene? come posso fare a risolvere l'errore sopra citato?

Grazie mille e scusatemi

alx_81 Profilo | Guru

>Le mie domande sono due: sto facendo bene? come posso fare a
>risolvere l'errore sopra citato?
no, non stai seguendo la strada che ti dicevo.. usa un foreach task e cambia l'enumeratore mettendo solo il path e l'eventuale pattern di ricerca.
Poi è il foreach che si occupa di ciclare sui file e ogni elemento in posizione 0 (nel mapping) corrisponde al nome del file.
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5