sql >> Base de Datos >  >> RDS >> Sqlserver

¿Por qué falla FireError en C# 2012, pero funciona en VB, mientras que FireInformation funciona en ambos?

Puede estar confundiendo la sintaxis similar pero diferente para activar eventos de error frente a información de componentes de secuencia de comandos (tarea de flujo de datos) frente a tareas de secuencia de comandos (flujo de control). El intellisense para Component indica que el parámetro es pbCancel mientras que fireAgain corresponde al parámetro de la Tarea de Información.

Componente de secuencia de comandos

Ejemplo de componente de secuencia de comandos 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);
}

Componente 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

No es necesario especificar explícitamente que un parámetro es Por referencia, ya que parece estar hecho en la definición frente al requisito de C# de especificarlo también en la invocación.Aclaración ByRef vs ByVal

Tarea de guión

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

Resumen

  • C# requiere que especifique ref y out palabras clave No son sinónimos
  • VB te permite hacer lo que quieras
  • El evento de error en los componentes tiene un parámetro de cancelación