Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Pourquoi FireError échoue-t-il dans C# 2012, mais fonctionne-t-il dans VB, alors que FireInformation fonctionne dans les deux ?

Vous pouvez confondre la syntaxe similaire mais différente pour le déclenchement des événements d'erreur et d'information des composants de script (tâche de flux de données) par rapport aux tâches de script (flux de contrôle). L'intellisense pour Component indique que le paramètre est pbCancel alors que fireAgain correspond au paramètre Information Task.

Composant de script

Exemple de composant de script C#

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    bool cancel = false;
    bool fireAgain = false;
    this.ComponentMetaData.FireInformation(0, "My sub", "info", string.Empty, 0, ref fireAgain);
    this.ComponentMetaData.FireError(0, "My sub", "error", string.Empty, 0, out cancel);
}

Composant VB

Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
    Dim cancel As Boolean
    Dim fireAgain As Boolean
    Me.ComponentMetaData.FireInformation(0, "my sub", "info", String.Empty, 0, fireAgain)
    Me.ComponentMetaData.FireError(0, "I hate vb", "Error", String.Empty, 0, cancel)
End Sub

Il n'est pas nécessaire de spécifier explicitement qu'un paramètre est par référence puisque cela semble être fait dans la définition par rapport à l'exigence C# de le spécifier également lors de l'invocation.Clarification ByRef vs ByVal

Tâche de script

C#

    public void Main()
    {
        bool fireAgain = false;
        this.Dts.Events.FireInformation(0, "my sub", "info", string.Empty, 0, ref fireAgain);
        // Note, no cancel available
        this.Dts.Events.FireError(0, "my sub", "error", string.Empty, 0);
    }

VB

Public Sub Main()
    Dim fireAgain As Boolean = False
    Me.Dts.Events.FireInformation(0, "my sub", "info desc", String.Empty, 0, fireAgain)
    Me.Dts.Events.FireError(0, "my sub", "error desc", String.Empty, 0)

    Dts.TaskResult = ScriptResults.Success
End Sub

Résumé

  • C# vous oblige à spécifier ref et out mots clés. Ce ne sont pas des synonymes
  • VB vous permet de faire n'importe quoi
  • L'événement d'erreur dans les composants a un paramètre d'annulation