2012-08-01 13 views
5

पर फ़ाइल नाम और स्टोर प्राप्त करें मैं एक एसएसआईएस पैकेज बनाने की कोशिश कर रहा हूं जिसका उपयोग मानक फ़ाइल सिस्टम संग्रह प्रक्रिया में किया जाएगा। असल में, मैं एक कॉन्फ़िगरेशन तालिका में जानकारी जोड़ सकता हूं और फिर निर्दिष्ट तालिका में कुछ फ़ाइलों को संग्रहीत करने के लिए इस तालिका का उपयोग कर पाऊंगा। मेरी समस्या यह है कि बहुत सी फाइलों में गतिशील नामकरण होता है इसलिए मुझे सभी फाइलों की एक सूची प्राप्त करने की आवश्यकता होती है और फिर यह तय करने के लिए क्वेरी होती है कि मुझे कौन सी फाइलों को छूना चाहिए।एसएसआईएस स्क्रिप्ट कार्य एक एसएसआईएस ऑब्जेक्ट वैरिएबल

सी #/वीबी प्रोग्रामर नहीं होने के कारण पैकेज के एक हिस्से को स्क्रिप्ट करने की कोशिश करते समय मुझे कुछ समस्याएं उत्पन्न होती हैं, जो किसी निर्दिष्ट नेटवर्क निर्देशिका में सभी फाइलों को पकड़ लेती हैं और फिर इन फ़ाइल नामों को एक एसएसआईएस ऑब्जेक्ट वैरिएबल में वापस खिलाती हैं।

मेरे पास एक स्ट्रिंग वेरिएबल 'उपयोगकर्ता :: SourceNetworkFolderName' है जिसमें उस फ़ोल्डर का यूएनसी स्थान होगा जिसमें से मैं सभी फाइलें पढ़ना चाहता हूं। मैं फिर इन सभी फाइलों के नाम (विस्तार के साथ) को 'उपयोगकर्ता :: SourceFilesInTheDirectory' नामक एक एसएसआईएस ऑब्जेक्ट वैरिएबल पर भेजना चाहता हूं। एक बार जब मेरे पास ऑब्जेक्ट वैरिएबल में फ़ाइल नामों की सूची हो, तो मैं उन्हें एक SQL तालिका में लूप करने का अनुमान लगा रहा था।

क्या किसी के पास मेरे एसएसआईएस ऑब्जेक्ट वैरिएबल में मेरी चर निर्देशिका से सभी फाइलों के नामों की सूची प्राप्त करने के बारे में कोई विशिष्ट सुझाव है?

अग्रिम धन्यवाद!

संपादित करें: यहाँ है मेरी अद्यतन कोड:

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; 
     } 
    } 
} 

उत्तर

5

अपनी स्क्रिप्ट के अंदर, सिर्फ फ़ाइल नाम की एक सरणी का निर्माण और (सुनिश्चित करें कि चर को लिखने योग्य के लिए सेट है अपने चर है कि सरणी सेट स्क्रिप्टिंग कार्य में)। यदि चर प्रकार ऑब्जेक्ट का है तो आप उसके बाद के कार्य में लूप का उपयोग करके इसे फिर से चालू कर सकते हैं और जो भी आप फ़ाइलों के साथ करना चाहते हैं। आपको केवल एक स्क्रिप्ट में किसी भी चमत्कार पर काम करने की आवश्यकता नहीं है।

किसी सरणी में अपने स्रोत निर्देशिका के अंतर्गत सभी फ़ाइलों रखो:

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

एक सरणी में "बिन" का एक विस्तार के साथ सभी फ़ाइलों रखो:

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

आपको कम से System.IO शामिल करने के लिए आवश्यकता हो सकती है आपके स्क्रिप्टिंग कोड का शीर्ष।

संपादित:

लूप कार्य से प्रसंस्करण के लिए एक सूची के लिए सरणी परिवर्तित करने के लिए। ऊपर दिए गए कोड को बुला के बाद, इस फोन:

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

आप अपने स्क्रिप्ट फ़ाइल के शीर्ष पर System.Collections.Generic शामिल करने के लिए की आवश्यकता होगी।

+0

सहायता के लिए धन्यवाद! मैंने कुछ प्रगति की है, लेकिन मैं फिर से अटक गया हूँ। मुझे लगता है कि मेरा नया मुद्दा इस तरह से संबंधित है कि मैं स्क्रिप्ट कार्य से अपने ऑब्जेक्ट वैरिएबल को पॉप्युलेट कर रहा हूं। डिबगर में मैं घड़ी का उपयोग कर रहा हूँ और मेरी चर 'उपयोगकर्ता :: SourceFilesInTheDirectory' दिखा रहा है: मूल्य = {आयाम: [2]} प्रकार = String [] मुझे विश्वास है कि क्रम में एक एडीओ के रूप में इस का उपयोग करना गणक, इसे पढ़ने की जरूरत है: मूल्य = {System.Data।डेटासेट} टाइप = डेटासेट – Joe

+0

मुझे बहुत करीब लगता है, लेकिन वर्तमान में मुझे इस चर को एडीओ एन्यूमेरेटर के रूप में चलाने की कोशिश करते समय डीबग त्रुटियां मिलती हैं। इस चर को सही प्रकार के रूप में प्राप्त करने के तरीके पर कोई विचार है ताकि मैं इसे Foreach Enumerator के रूप में उपयोग कर सकूं? मैं नीचे मेरी कोड चिपकाया है: – Joe

+0

'कोड सार्वजनिक शून्य मुख्य() { // एक सरणी स्ट्रिंग के लिए 'SourceNetworkFolderName' लघु उद्योगों चर से फ़ाइलों की एक सूची प्राप्त करें [] array1 = Directory.GetFiles (Dts.Variables [ "SourceNetworkFolderName"] Value.ToString())। // एसएसआईएस ऑब्जेक्ट वेरिएबल 'SourceFilesInTheDirectory' को सरणी Dts.Variables ["SourceFilesInTheDirectory"] से सभी फ़ाइल नामों के साथ पॉप्युलेट करें। मान = array1; DTS.TaskResult = (int) ScriptResults.Success; } ' – Joe