8
votes

Ne peut pas appliquer d'indexation avec [] à une expression de type

Je crée un package SSIS et je veux inclure un script qui vérifie si un fichier existe avant de récupérer le fichier et de sauvegarder que des données sur une table.

J'ai trois variables distinctes que j'ai installées: p >

FileExistFlag Int32 0 Code> P>

Nom de fichier check.txt p>

folderPath String c: \ Code> P>

Mon code C # ressemble à ceci, où je vérifie: p> xxx pré>

Lorsque j'essaie de compiler mon script, je reçois l'erreur suivante: p>

ne peut pas appliquer d'indexation avec [] à une expression de type 'microsoft.sqlserver.dts.runtime.variables code> pour les quatre instances. P>

Comment puis-je Résolvez le problème? P>

Code mis à jour: P>

/*
   Microsoft SQL Server Integration Services Script Task
   Write scripts using Microsoft Visual C# 2008.
   The ScriptMain is the entry point class of the script.
*/

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

namespace ST_04f6fa3ba49a4ddeac3d3d7fc29f04f2.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

        /*
        The execution engine calls this method when the task executes.
        To access the object model, use the Dts property. Connections, variables, events,
        and logging features are available as members of the Dts property as shown in the following examples.

        To reference a variable, call Dts.Variables["MyCaseSensitiveVariableName"].Value;
        To post a log entry, call Dts.Log("This is my log text", 999, null);
        To fire an event, call Dts.Events.FireInformation(99, "test", "hit the help message", "", 0, true);

        To use the connections collection use something like the following:
        ConnectionManager cm = Dts.Connections.Add("OLEDB");
        cm.ConnectionString = "Data Source=localhost;Initial Catalog=AdventureWorks;Provider=SQLNCLI10;Integrated Security=SSPI;Auto Translate=False;";

        Before returning from this method, set the value of Dts.TaskResult to indicate success or failure.

        To open Help, press F1.
    */

        public void Main()
        {
            // TODO: Add your code here
            String fp = Dts.Variables.Get("User::folderPath").Value.ToString() + Dts.Variables.Get("User::fileName").Value.ToString();
            if (File.Exists(fp))
            {
                Dts.Variables.Get("User::fileExistFlag").Value = 1;
            }
            MessageBox.Show(fp);
            MessageBox.Show(Dts.Variables.Get("User::fileExistFlag").Value.ToString());
            Dts.TaskResult = (int)ScriptResults.Success;
        }
    }
    public static Microsoft.SqlServer.Dts.Runtime.Variable Get(
        this Microsoft.SqlServer.Dts.Runtime.Variables variables, string name)
    {
        foreach(Microsoft.SqlServer.Dts.Runtime.Variable item in variables)
        {
            if(item.Name == name) return item;
        }
        return null;
    }
}


2 commentaires

Impair ... il semble être là: msdn.microsoft.com/en-us/library/...


Il n'y a pas besoin d'écrire ce code. À l'aide de l'énumérateur de Forache (Fichier) extraire tous les fichiers correspondant à un modèle existant. Si aucun fichier n'est trouvé, en supposant que vous disposez d'une tâche de flux de données dans le conteneur, cela ne va pas l'exécuter. Je soupçonne que vous avez quelque chose de légèrement éteint dans le code, je vérifierai une fois que je vais au bureau


3 Réponses :


3
votes

Curthly, cet indexer semble exister . Si cela ne fonctionne pas, cependant, vous pourrez peut-être utiliser une méthode d'extension: xxx

et utiliser: xxx

.


13 commentaires

Merci pour la réponse. Je suis tout neuf au script SSIS alors avoir un problème. J'ai changé mon code pour refléter votre réponse et maintenant je reçois deux erreurs. Tout d'abord est, membre non invocable 'Microsoft.SQLSERVER.DTS.TASKS.ScriptTTASK.ScriptObjectModel. variables' ne peut pas être utilisé comme une méthode et une seconde, le type de nom d'espace de noms 'Variable' n'a pas pu être trouvé


@SearchForknowledge nom de type complet explicite ajouté


J'ai modifié votre code (espérons que cela va bien) de faire disparaître toute erreur, mais je suis présenté avec une autre erreur, Les méthodes d'extension doivent être définies dans une classe statique non générique ...


@SearchForknowledge qui (ajout d'un "s") n'était pas tout à fait la bonne solution; ont édité; Quant à l'autre: faire ce qu'il dit (je vais éditer cela aussi)


J'ai mis à jour ma question avec la façon dont mon code est en ce moment. S'il vous plaît laissez-moi savoir quoi corriger.


@SearchForkNowledge Il suffit de déplacer cette méthode flottante à l'intérieur d'une classe, comme indiqué ci-dessus


Alors, mettez-le à l'extérieur principal mais à l'intérieur du classe partielle publique ?


@SearchForknowledge non, le classe statique va intérieur l'espace de noms , mais extérieur de la classe partielle .


Merci et maintenant le script ne lance aucune erreur. J'ai un problème lorsque j'exécute le paquet SSIS, mais je vais ouvrir une autre question et lierez-le ici. Seule juste que vous obtenez du crédit pour ce que j'ai demandé dans mon titre de question qui fonctionne.


Je vais écrire l'erreur ici et ouvrir la nouvelle question: Erreur: 0x1 à la tâche du script: System.Reflection.TargetinVocationException: une exception a été lancée par la cible d'une invocation. ---> Système.NullReferenceException: référence d'objet non définie sur une instance d'un objet. at st_04f6fa3ba49a4ddeac3d3d7fc29f04f2.csproj.scriptMain.Main ()


@SearchForknowledge que probablement signifie simplement que obtenez renvoie null , car il n'y a pas de variable de correspondance. Pouvez-vous le déboguer et passer à travers?


J'ai copié et collé la variable que j'ai créée dans mon paquet SSIS avec la variable de mon script.


Je l'ai finalement réparé ... Parce que j'utilise la fonction personnalisée, je devais supprimer l'utilisateur : et conserver la chaîne. Merci pour l'aide



14
votes

Il s'agit d'un bug connu dans SQL Server des enchères 2005/2008 après l'installation d'une version ultérieure de la SSIS. Par exemple, si vous développez un package SSIS 2008, puis installez SSIS 2012.

A Solution de contournement est de déplacer le fichier "microsoft.sqlserver.manageddts.dll" situé sur le chemin: "C: \ Fichiers de programme (x86) \ Microsoft SQL Server \ 110 \ sdk \ assemblages" dans un dossier de sauvegarde, les offres prennent la référence du chemin "C: \ Windows \ Assemblage \ gac_msil \ microsoft.sqlserver.manageddts \ 10.0.0.0__89845DCD8080CC91 \ "

Mais cela ne semble pas fonctionner pour tous les cas signalés.

Source:

https://connect.microsoft.com/sqlserver/feedback/details/744390/ssis-an-pre-2012-Error-Cannot-apply-Intexing-with -à-a-expression-de-expression-de type-Microsoft-SQLSERVER-DTS-Runtime-variables

http://support.microsoft.com/kb/938608/en-us


5 commentaires

Merci pour votre réponse. J'ai fait exactement cela et cela a également contribué à résoudre mon problème.


+1 a juste eu le même problème et cela a fonctionné pour moi. La réponse acceptée n'a pas. Il s'est plaint de runtime dans microsoft.sqlserver.dts.runtime.variables


Travaillé pour moi aussi. Merci!


Travaillé pour moi sous Windows 10 avec une installation côte à côte de SQL 2014.


Travaillé pour moi sous Windows 7 avec une installation côte à côte de SQL 2008 et SQL 2012.



1
votes

Utilisez parcourir la fenêtre Ajouter des références et recherchez cette DLL: C: \ Fichiers du programme (X86) \ Microsoft SQL Server \ 100 \ SDK \ assemblages \ microsoft.sqlserver.manageddts.dll


0 commentaires