2013-09-04 79 views
18

Trong ứng dụng của tôi, tác vụ kịch bản được tạo tự động.Đặt mã Tác vụ Script động trong SSIS 2012

Trong triển khai SSIS 2008 của SQL Server 2008, phương pháp sau đây hoạt động tốt.

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."); 
     } 
    } 

Làm thế nào để di chuyển mã này vào SQL Server 2012, vì phương pháp sau đây được lấy từ SQL Server 2012 dll-s (cụm):

  • InitNewScript
  • AddProjectReference
  • AddCodeFile
  • SaveScriptToStorage
  • ĐóngIDE
  • Xây dựng
  • ShowDesigner

Nói chung, làm thế nào để tự động thiết lập mã nguồn cho nhiệm vụ kịch bản trong SQL Server 2012?

+0

+1 và một ngôi sao cho bạn vì tôi chưa bao giờ cố gắng thực hiện việc này. Tài liệu tôi tìm thấy đề cập đến [ScriptingEngine] (http://technet.microsoft.com/en-us/library/microsoft.sqlserver.dts.tasks.scripttask.vstataskscriptingengine.aspx) và nói "API này hỗ trợ SQL Server Cơ sở hạ tầng năm 2012 và không có ý định được sử dụng trực tiếp từ mã của bạn "vì vậy tôi không được tìm kiếm đủ cứng. Điều đáng tiếc là tôi có những vụ cháy sản xuất để tham dự, điều này nghe có vẻ như là một thách thức thú vị – billinkc

+3

Để đẩy bạn đi đúng hướng (vì tôi chỉ thực hiện điều này cho các thành phần Script chứ không phải các tác vụ Script) có giao diện VSTA mới cho SSIS 2012, Lớp VSTAHelper - http://tinyurl.com/vstahelper - nơi tất cả các phương pháp của bạn đã đi. –

Trả lời

4

Như bạn đã nhận thấy, VSTA helper methods bạn có thể sử dụng trong năm 2008 đã được di chuyển/xóa vào năm 2012. Vẫn có thể thực hiện, nhưng mã đã thay đổi.

Điều đơn giản nhất cần làm là tải dự án hiện có bằng cách sử dụng VstaHelper.LoadProjectFromFolder().

Nếu bạn muốn tự động thêm tệp tập lệnh, hãy xem đoạn mã bên dưới. Có hai điều chính bạn cần lưu ý:

Các lớp ScriptingEngine và VstaHelper đại diện cho chính VSTA. Đây là nơi bạn sẽ tạo dự án và thêm tệp mới. Bạn không thể xóa hoặc thay thế tệp hiện có ngay tại đây. Khi bạn gọi SaveProjecToStorage(), nó giống như đóng cửa sổ VSTA… nó lưu dự án và biên dịch nhị phân vào ScriptTask.

ScriptTask.ScriptStorage cho phép bạn thao tác trực tiếp nội dung tệp nguồn. Từ đây, bạn có thể sửa đổi nội dung của một tập tin.

Đoạn mã sau sẽ giúp bạn bắt đầu.

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

Cảm ơn bạn. Tôi sẽ sẵn sàng cung cấp cho bạn tiền thưởng đó. –