2016-04-28 14 views
0

Ich verwende SSIS und verwende eine Skriptaufgabe, um Dateigrößen von Dateien abzurufen, die in der for-each-Schleife verarbeitet wurden. Ich habe zwei Variablen.Abrufen der Dateigröße SSIS C#

  • FileFound: Dies ist der Name der Datei, in der Enumerator foreach Datei

  • FileFoundSize abgeholt - Dies ist eine Int64 Variable ohne Wert.

Meine Schritte sind:

  • Drag-und Script-Aufgabe in der foreach-Behälter

  • bearbeiten Script- Mein Code ist

    using System; 
    using System.IO;       
    using System.Data; 
    using Microsoft.SqlServer.Dts.Runtime; 
    using System.Windows.Forms; 
    namespace ST_7068b53f6bf04efd812e51a1aee0c396 
    { 
    
    Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute] 
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase 
    { 
    
        public void Main() 
        { 
        FileInfo fileInfo; 
        fileInfo = new FileInfo(Dts.Variables["User::FileFound"].Value.ToString()); 
        Dts.Variables["User::FileFoundSize"].Value = fileInfo.Length; 
    
    
        Dts.TaskResult = (int)ScriptResults.Success; 
    } 
    
    
    enum ScriptResults 
    { 
        Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success, 
        Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure 
    }; 
    
    
    } 
    } 
    

fallen Wenn ich diese Aufgabe ausführe bekomme ich die Ausnahme wurde durch das Ziel eines Aufrufs geworfen. Was ist falsch an meinem Skript?

+1

Ihr Code ist einfach, meine erste beste Vermutung ist, dass Ihre FileFound-Variable nicht richtig aufgefüllt wird oder Ihr FileInfo-Befehl nicht auf die Datei zugreifen kann. Setzen Sie einen Breakpoint in Ihre Main() -Methode und führen Sie ihn durch. –

+0

Sie korrigieren vielleicht. Muss die FileFound-Variable der vollständige Pfad der Datei einschließlich Dateiname und Erweiterung sein? Derzeit ist meine FileFound-Variable eine Zeichenfolge. – MaxPD

+0

Danke @KyleHale. Ihr Vorschlag hat mir geholfen. – MaxPD

Antwort

1

Ja, Sie benötigen den vollständigen Pfad einschließlich der Dateierweiterung. (Um technisch korrekt zu sein: Du könnte den Pfad verlassen, wenn das ssis-Paket im selben Verzeichnis ausgeführt wird, in dem sich die Dateien befinden. Aber ich gehe davon aus, dass das nicht der Fall ist).

Um Ihren Code ein wenig robuster, mache ich folgendes tun würde:

public void Main() 
{ 
    string fullPath = Path.Combine(Dts.Variables["User::FilePath"].Value.ToString(), Dts.Variables["User::FileFound"].Value.ToString(), Dts.Variables["User::FileExtension"].Value.ToString()); 
    var fileInfo = new FileInfo(fullPath); 

    if (fileInfo.Exists()) 
    { 
     Dts.Variables["FileFoundSize"] = fileInfo.Length; 
     Dts.TaskResult = (int)ScriptResults.Success; 
    } 
    else 
    { 
     // file could not be found  
     Dts.TaskResult = (int)ScriptResults.Failure; 
    } 
+0

Danke. Ich weiß, dass die Datei vorhanden ist, daher brauche ich diese zusätzliche Schleife nicht. – MaxPD

1

DTS-Variablen aus Adressierung innerhalb eines Skripts ist kein Spaß. Es gibt keine Entwurfszeitüberprüfung, dass das Mitglied der Variablensammlung (z. B. "FileFoundSize") vorhanden und verfügbar ist.

Zusammen mit dem verärgernden modalen Verhalten des Fensters Skript bearbeiten (zumindest in VS2008, leider habe ich vergessen, was passiert, wenn Sie mit VS2012 arbeiten) verhindern Sie das Umdrehen auf Ihr Paket Variablenanzeige zu überprüfen, Sie haben die Rechtschreibung.

Gemeinsame gotchas ich mit diesem in ausgeführt haben:

  1. Der Variablenname ist (immer so leicht) falsch geschrieben in Ihrem Code;
  2. Die Variablen bei der Kodierung/Build offensichtlich sein, wurden in der Haupt Script Task-Bildschirm (Readonly-Variablen oder Variablen lesen/schreiben), um das Skript nicht gemacht „verfügbar“

Keines dieser Probleme Zeit. (BTW, wenn Sie versucht haben, dieses Problem zu debuggen, indem Sie Haltepunkte festlegen, die nicht ausgelöst werden, überprüfen Sie die Eigenschaften des Projekts, Debuggen, und stellen Sie sicher, dass Use64BitRunTime FALSE ist).

+0

Nur zur Bestätigung: Es ist nicht mehr modal in 2012+. –

+0

Danke dafür. Es gibt mir Hoffnung, denn wenn ich hier bin und VS2012 wieder benutze. Ich hatte meinen Kopf so fest in VS2008 stecken, dass ich vergessen habe, was ich von VS2012 + wusste ... – SebTHU

+0

Danke @SebTHU für die ausführliche Antwort. – MaxPD

Verwandte Themen