2012-08-01 26 views
5

Tôi đang cố gắng xây dựng gói SSIS sẽ được sử dụng trong quy trình lưu trữ tệp hệ thống chuẩn hóa. Về cơ bản, tôi sẽ có thể thêm thông tin vào một bảng cấu hình và sau đó sử dụng bảng này để lưu trữ các tệp nhất định trong các thư mục được chỉ định. Vấn đề của tôi là rất nhiều các tập tin có đặt tên động vì vậy tôi cần phải có được một danh sách tất cả các tập tin và sau đó truy vấn để quyết định những tập tin tôi cần phải chạm vào. Không phải là một lập trình viên C#/VB đang gây ra cho tôi một số vấn đề khi cố gắng viết một phần của gói, lấy tất cả các tệp trong một thư mục mạng được chỉ định và sau đó nạp các tên tệp này vào biến đối tượng SSIS. Quay lại đầu trangTác vụ Tập lệnh SSIS Nhận Tên Tệp và Lưu trữ vào Biến đối tượng SSIS

Tôi có biến chuỗi 'Người dùng :: SourceNetworkFolderName' sẽ chứa vị trí UNC của thư mục mà tôi muốn đọc tất cả các tệp từ đó. Tôi muốn sau đó vượt qua tất cả các tên tập tin (với phần mở rộng) trở lại một biến đối tượng SSIS gọi là 'User :: SourceFilesInTheDirectory'. Một khi tôi có danh sách các tên tập tin vào biến đối tượng, tôi sẽ foreach vòng lặp chúng vào một bảng SQL.

Có ai có bất kỳ gợi ý cụ thể nào về cách tôi đi lấy danh sách tất cả tên tệp từ thư mục biến của tôi đến biến đối tượng SSIS của tôi không?

Cảm ơn bạn trước!

EDIT: Đây là mã cập nhật của tôi:

using System; 
using System.Data; 
using Microsoft.SqlServer.Dts.Runtime; 
using System.Windows.Forms; 
using System.IO; 
using System.Collections.Generic; 
using System.Data.SqlClient; 

namespace ST_f5e4ae71f14d40d8811af21fa2a9a622.csproj 
{ 
    [System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")] 
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase 
    { 

     #region VSTA generated code 
     enum ScriptResults 
     { 
      Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success, 
      Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure 
     }; 
     #endregion 

     public void Main() 
     { 
     //Setup Connection String to SQL 
      SqlConnection SQLConnection = new SqlConnection(
             //"user id=username;" +     //UserName 
             //"password=password;" +     //Password 
             "Trusted_Connection=true;" +    //Windows Auth 
             "server=SERVERNAME;" +     //SQL Server 
             "database=DATABASENAME; " +    //SQL Database 
             "connection timeout=30;" +    //connection timeout 
             "Network Library=dbmssocn");    //TCP/IP Connection ("dbnmpntw" = Name Pipes) 


     //Open the SQL Connection and remove the error code 
      try 
      { 
       SQLConnection.Open(); 
      } 
      catch (Exception OpenConnectionError) 
      { 
       Console.WriteLine(OpenConnectionError.ToString()); 
      } 


     //Fetch a list of files from 'SourceNetworkFolderName' SSIS variable to an array called array1. 
      string[] ArrayFileName = Directory.GetFiles(Dts.Variables["SourceNetworkFolderName"].Value.ToString()); 


     //Set up sql variable for table population 
      SqlParameter SQLFileNameParam = new SqlParameter("@FileName", SqlDbType.VarChar, 100); 


     //Loop through the array and insert into an SQL table 
      foreach (string strFileName in ArrayFileName) 
      { 
      //Update sql variable with file names from array 
       SQLFileNameParam.Value = strFileName; 
      //Make the table insert 
       SqlCommand SQLInsertToTable = new SqlCommand("INSERT INTO Archive_Extract_Network_Folder_File_List (FileName) VALUES (@FileName)", SQLConnection); 
      //This snippit allows the use of the variable in the sql script. 
       SQLInsertToTable.Parameters.Add(SQLFileNameParam); 
      //Execute SqlCommand 
       SQLInsertToTable.ExecuteNonQuery(); 
      //Clear the parameters and set the object to null  
       SQLInsertToTable.Parameters.Clear(); 
       SQLInsertToTable = null; 
      } 


     //Close the SQL Connection and remove the error code 
      try 
      { 
       SQLConnection.Close(); 
      } 
      catch (Exception CloseConnectionError) 
      { 
       Console.WriteLine(CloseConnectionError.ToString()); 
      } 


     //Set array to null since it is no longer required. 
      ArrayFileName = null; 


     //Exit on success 
      Dts.TaskResult = (int)ScriptResults.Success; 
     } 
    } 
} 

Trả lời

5

Bên trong kịch bản của bạn, chỉ cần xây dựng một loạt các tên tập tin và thiết lập mảng đó để biến của bạn (đảm bảo biến được thiết lập để có thể ghi trong tác vụ kịch bản). Nếu biến là đối tượng kiểu, bạn có thể lặp lại nó bằng cách sử dụng vòng lặp for trong một tác vụ tiếp theo và làm bất cứ điều gì bạn muốn với các tệp. Bạn không cần phải làm việc trên bất kỳ phép lạ chỉ trong một kịch bản.

Đặt tất cả các file dưới dir nguồn của bạn trong một mảng:

string[] array1 = Directory.GetFiles(Dts.Variables("SourceNetworkFolderName").Value.ToString()); 

Đặt tất cả các file với phần mở rộng của "BIN" trong một mảng:

string[] array2 = Directory.GetFiles(Dts.Variables("SourceNetworkFolderName").Value.ToString(), "*.BIN"); 

Bạn có thể cần phải bao gồm System.IO tại đầu mã kịch bản của bạn.

EDIT:

Để chuyển đổi mảng vào một danh sách để xử lý bằng các nhiệm vụ Loop. Sau khi gọi đoạn mã trên, gọi đây là:

List<string> fileList = new List<string>(astrTest); 
Dts.Variables["SourceFilesInTheDirectory"].Value = fileList; 

Bạn sẽ cần phải bao gồm System.Collections.Generic ở phía trên cùng của tập tin kịch bản của bạn.

+0

Cảm ơn sự giúp đỡ của bạn! Tôi đã thực hiện một số tiến bộ, nhưng tôi lại bị mắc kẹt. Tôi nghĩ rằng vấn đề mới của tôi là liên quan đến cách tôi đang cư trú biến đối tượng của tôi từ nhiệm vụ kịch bản. Trong trình gỡ rối tôi đang sử dụng đồng hồ và biến của tôi 'Người dùng :: SourceFilesInTheDirectory' đang hiển thị: Giá trị = {Thứ nguyên: [2]} Loại = Chuỗi [] Tôi tin rằng để sử dụng biến này làm ADO điều tra viên cần đọc: Giá trị = {System.Data.DataSet} Type = DataSet – Joe

+0

Tôi cảm thấy siêu gần, nhưng hiện tại tôi gặp lỗi gỡ lỗi khi cố chạy biến này dưới dạng Bộ đếm ADO Foreach. Bất kỳ ý tưởng nào về cách biến biến này thành loại đúng để tôi có thể sử dụng nó như một toán tử Foreach? Tôi đã dán mã của tôi dưới đây: – Joe

+0

'đang public void Main() { // Fetch một danh sách các tập tin từ biến SSIS 'SourceNetworkFolderName' để một chuỗi mảng [] array1 = Directory.GetFiles (Dts.Variables [ "SourceNetworkFolderName"]. Value.ToString()); // Điền biến đối tượng SSIS 'SourceFilesInTheDirectory' với tất cả tên tệp từ mảng Dts.Variables ["SourceFilesInTheDirectory"]. Value = array1; Dts.TaskResult = (int) ScriptResults.Success; } ' – Joe

Các vấn đề liên quan