2013-09-04 11 views
18

Nella mia applicazione, un'attività di script viene creata dinamicamente.Imposta codice attività Script in modo dinamico in SSIS 2012

Nell'implementazione di SSIS di SQL Server 2008, il seguente metodo ha funzionato correttamente.

private void SetSourceCode(ScriptTask scriptTask, string code, string codeName) 
    { 
     string fileName = "ScriptMain.vb"; 
     string language = "VisualBasic"; 
     string proj = ".vbproj"; 

     scriptTask.ScriptLanguage = VSTAScriptLanguages.GetDisplayName(language); 

     scriptTask.ScriptingEngine.InitNewScript(language, 
     scriptTask.ScriptProjectName, proj); 

     scriptTask.ScriptingEngine.ShowDesigner(false); 
     scriptTask.ScriptingEngine.AddCodeFile(fileName, code); 

     if (!scriptTask.ScriptingEngine.Build()) 
      throw new Exception("Failed to build vb script code: " + codeName); 
     scriptTask.ScriptingEngine.SaveScriptToStorage(); 
     if (!scriptTask.ScriptingEngine.CloseIDE(false)) 
     { 
      throw new Exception("Unable to close Scripting engine."); 
     } 
    } 

Come faccio a migrare questo codice di SQL Server 2012, perché seguenti metodi vengono rimossi da SQL Server 2012 dll-s (assemblee):

  • InitNewScript
  • AddProjectReference
  • AddCodeFile
  • SaveScriptToStorage
  • CloseIDE
  • costruire
  • ShowDesigner

In generale, come faccio in modo dinamico insieme di codici sorgente per un'attività di script in SQL Server 2012?

+0

+1 e una stella per te poiché non ho mai provato a farlo. La documentazione che trovo si riferisce al [ScriptingEngine] (http://technet.microsoft.com/en-us/library/microsoft.sqlserver.dts.tasks.scripttask.vstataskscriptingengine.aspx) e afferma "Questa API supporta SQL Server Infrastruttura del 2012 e non è destinato ad essere utilizzato direttamente dal tuo codice "quindi non devo essere abbastanza duro. Peccato per il fatto che ho dei fuochi di produzione da frequentare, sembra una sfida divertente – billinkc

+3

Per spingerti nella giusta direzione (dato che ho fatto solo questo per Componenti script e non per Script) c'è una nuova interfaccia VSTA per SSIS 2012, la Classe VSTAHelper - http://tinyurl.com/vstahelper - dove sono andati tutti i tuoi metodi. –

risposta

4

Come hai notato, lo VSTA helper methods che potresti utilizzare nel 2008 sono stati spostati/rimossi nel 2012. È ancora possibile farlo, ma il codice è cambiato.

La cosa più semplice da fare è caricare un progetto esistente usando VstaHelper.LoadProjectFromFolder().

Se si desidera aggiungere in modo dinamico file di script, vedere lo snippet di seguito. Esistono due aspetti principali da tenere a mente:

Le classi ScriptingEngine e VstaHelper rappresentano VSTA stesso. Qui è dove devi creare il progetto e aggiungere nuovi file. Non è possibile rimuovere o sostituire un file esistente direttamente qui. Quando chiami SaveProjecToStorage(), è come chiudere la finestra VSTA ... salva il progetto e compila binari nello ScriptTask.

ScriptTask.ScriptStorage consente di manipolare direttamente il contenuto del file di origine. Da qui, puoi modificare il contenuto di un file.

Il seguente frammento di codice dovrebbe aiutarti a iniziare.

static void Main(string[] args) 
{ 
    // 1. Create new package, and add a script task 
    var pkg = new Package(); 
    var exec = pkg.Executables.Add("STOCK:ScriptTask"); 
    var th = (TaskHost)exec; 
    th.Name = "Script Task"; 
    th.Description = "This is a Script Task"; 
    var task = (ScriptTask)th.InnerObject; 

    // 2. Set the script language - "CSharp" or "VisualBasic" 
    task.ScriptLanguage = VSTAScriptLanguages.GetDisplayName("CSharp"); 

    // 3. Set any variables used by the script 
    //task.ReadWriteVariables = "User::Var1, User::Var2"; 

    // 4. Create a new project from the template located in the default path 
    task.ScriptingEngine.VstaHelper.LoadNewProject(task.ProjectTemplatePath, null, "MyScriptProject"); 

    // 5. Initialize the designer project, add a new code file, and build 
    //task.ScriptingEngine.VstaHelper.Initalize("", true); 
    //task.ScriptingEngine.VstaHelper.AddFileToProject("XX.cs", "FileContents"); 
    //task.ScriptingEngine.VstaHelper.Build(""); 

    // 6. Persist the VSTA project + binary to the task 
    if (!task.ScriptingEngine.SaveProjectToStorage()) 
    { 
     throw new Exception("Save failed"); 
    } 

    // 7. Use the following code to replace the ScriptMain contents 
    var contents = File.ReadAllText("path to file"); 
    var scriptFile = 
     task.ScriptStorage.ScriptFiles["ScriptMain.cs"] = 
     new VSTAScriptProjectStorage.VSTAScriptFile(VSTAScriptProjectStorage.Encoding.UTF8, contents); 


    // 8. Reload the script project, build and save 
    task.ScriptingEngine.LoadProjectFromStorage(); 
    task.ScriptingEngine.VstaHelper.Build(""); 

    // 9. Persist the VSTA project + binary to the task 
    if (!task.ScriptingEngine.SaveProjectToStorage()) 
    { 
     throw new Exception("Save failed"); 
    } 

    // 10. Cleanup 
    task.ScriptingEngine.DisposeVstaHelper(); 

    // 11. Save 
    string xml; 
    pkg.SaveToXML(out xml, null); 

    File.WriteAllText(@"c:\temp\package.dtsx", xml); 
} 
+0

Grazie. Ti darò volentieri quella taglia. –

Problemi correlati