2017-10-13 7 views
0

J'essaye d'envoyer un ensemble de résultats de requête dans un courrier électronique en utilisant SSIS. Voici la capture d'écran et les étapes pour le flux.Un blocage a été détecté lors de la tentative de verrouillage des variables. Un verrou ne peut pas être acquis après 16 tentatives. Les verrous ont expiré

Screenshot:

enter image description here

Étapes: 1. A l'aide tâche SQL pour obtenir les résultats de la requête dans l'objet "QueryResult" Variable 2. Utilisation de la variable d'objet "QueryResult" dans la boucle Foreach et d'obtenir les valeurs des colonnes dans les variables de chaîne "ProjectRefID" et "Numéro de compte"

enter image description here

3.Grâce scri pt tâche à l'intérieur du conteneur ForEachLoop pour capturer les données dans la variable d'objet « résultat de la requête »

enter image description here

  1. est le code ci-dessous dans la tâche de script que je copiais de la l'Internet.

    en utilisant System; en utilisant System.Data; en utilisant Microsoft.SqlServer.Dts.Runtime; en utilisant System.Windows.Forms;

    endregion

    namespace ST_77e6b4ea18824b909adc5568475fcf5c 
    { 
    
        [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute] 
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase 
    
    
    
    { 
    
        public void Main() 
        { 
         Variables varCollection = null; 
         string header = string.Empty; 
         string message = string.Empty; 
    
         Dts.VariableDispenser.LockForWrite("User::ValidationEmailMessage"); 
         Dts.VariableDispenser.LockForRead("User::Accountnumber"); 
         Dts.VariableDispenser.LockForRead("User::ProjectRefID"); 
         Dts.VariableDispenser.GetVariables(ref varCollection); 
    
         if (varCollection["User::ValidationEmailMessage"].Value == string.Empty) 
         { 
          header = "Below are the list of Invalid ProjecRefID and Accountnumbers that are not matching with our existing data:\n\n"; 
          header += string.Format("{0}\t{1}\t\t\t{2}\n", "ProjectRefID", "Accountnumber"); 
          varCollection["User::ValidationEmailMessage"].Value = header; 
          varCollection.Unlock(); 
         } 
    
    
         //Format the query result with tab delimiters 
         message = string.Format("{0}\t{1}\t{2}", 
                varCollection["User::ProjectRefID"].Value, 
                varCollection["User::Accountnumber"].Value); 
    
         varCollection["User::ValidationEmailMessage"].Value = varCollection["User::ValidationEmailMessage"].Value + message; 
         varCollection.Unlock(); 
         Dts.TaskResult = (int)ScriptResults.Success; 
    
        } 
    
    
        enum ScriptResults 
        { 
         Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success, 
         Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure 
        }; 
    
    
    } 
    

    }

J'ai essayé de résoudre cette erreur, mais de toute façon je ne suis pas en mesure de comprendre. Faites-moi savoir si quelqu'un sait comment le résoudre.

Répondre

0

À moins que vous avez besoin de la fonctionnalité de verrouillage pour une raison quelconque, vous devriez être en mesure d'écrire la méthode principale simplement comme ceci:

public void Main() 
{ 
    string header = string.Empty; 
    string message = string.Empty; 

    if (Dts.Variables["User::ValidationEmailMessage"].Value == string.Empty) 
    { 
     header = "Below are the list of Invalid ProjecRefID and Accountnumbers that are not matching with our existing data:\n\n"; 
     header += string.Format("{0}\t{1}\t\t\t{2}\n", "ProjectRefID", "Accountnumber"); 
     Dts.Variables["User::ValidationEmailMessage"].Value = header; 
    } 


    //Format the query result with tab delimiters 
    message = 
     string.Format("{0}\t{1}\t{2}", 
      Dts.Variables["User::ProjectRefID"].Value, 
      Dts.Variables["User::Accountnumber"].Value); 

    Dts.Variables["User::ValidationEmailMessage"].Value = Dts.Variables["User::ValidationEmailMessage"].Value + message; 

    Dts.TaskResult = (int)ScriptResults.Success; 
} 

En outre, avec votre string.Format code, vous spécifiez trois indices, {0} , {1} et {2}, mais vous ne fournissez que 2 arguments, par exemple, , "ProjectRefID", "Accountnumber");.