Wie zu scheitern einer SSIS-Skript-Task (mit C#, 2008)
Ich habe gesehen, viele codes rumliegen, aber anscheinend Sie nicht helfen.
Hier ist die Logik, die ich zu befolgen:
Ich habe eine Datei immer Lesen, die hat eine Menge Bereich. Dieser Betrag-Feld kann negative. Ich habe um die Datei zu verschieben und nicht die Paket, wenn ich einen negativen Betrag in der Datei.
Was ich gemacht habe bisher:
Hinzugefügt, ein Skript-task zu bekommen, Datei-Pfad Hinzugefügt-Schleife zum Lesen alle Dateien in diesem Pfad, der innerhalb der Schleife(Hinzugefügt DTS-task zu verschieben, Mitglieder mit negativen Mengen zu einem Datensatz Hinzugefügt-Skript Aufgabe zu prüfen, ob es werden alle Zeilen im recordset, wenn count > 0 wird dann nicht das Skript Aufgabe, so dass das Paket, sonst pass)
Den scipt-task-code:
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.Data.OleDb;
using System.IO;
using System.Xml;
//name space call here etc, etc..
enum ScriptResults
{
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};
public void Main()
{
//TODO: Add your code here
bool fireAgain = true;
DataTable dtable = new DataTable();
OleDbDataAdapter da = new OleDbDataAdapter();
//Setting this incase there are multiple files being checked
Dts.Variables["InvalidFile"].Value = "False";
da.Fill(dtable, Dts.Variables["NegativeAmountMember"].Value);
//I do get my desired result here of 1
Dts.Events.FireInformation(0, "dtable", dtable.Rows.Count.ToString(), String.Empty, 0, ref fireAgain);
if (dtable.Rows.Count > 0)
{
Dts.Variables["InvalidFile"].Value = "True";
Dts.Events.FireInformation(0, "InvalidFile", Dts.Variables["InvalidFile"].Value.ToString(), String.Empty, 0, ref fireAgain); //This does get displayed but, nothing happens after this step.
Dts.TaskResult = (int)ScriptResults.Failure; //this method never technically executes
return; //added this because someone somewhere said in a post to do so
}
else
{
Dts.TaskResult = (int)ScriptResults.Success;
}
}
Habe ich alles, außer scheitern dieses Skript Aufgabe.
Ich habe auch versucht FireError, gar nicht aufgerufen.
Was passiert ist, kann jemand bitte erklären?
- Ich verstehe nicht, Ihren Kommentar auf
Dts.TaskResult = (int)ScriptResults.Failure;
nicht, Dass die Aufgabe. Helfen Sie mir zu verstehen, wie das nicht passiert - Ich habe das Feuer info-Ereignis ausgeführt wird, aber, wenn die
Dts.TaskResult = (int)ScriptResults.Failure;
Schritt wird immer ausgeführt, die ScriptTask hört nie auf/schlägt fehl. Es ist immer noch in der "gelben phase". - Ich glaube, Sie brauchen, um die
Script Task
EigenschaftForcedParentOnFailure
oderForcedPackageOnFailure
zu Wahren je nach Ihrer Anforderung. Sie haben die Aufgabe, in ein-Schleifen-container. - FailParentOnFailure und FailPackageOnFailure waren beide auf true gesetzt. Aber, das Problem war ein deadlock in den code. Eine Antwort darauf.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In SSIS, Ausfall nicht automatisch anhalten der Ausführung (wie du ihn gefunden hast). Scheitern ist ein Zustand, der anzeigt, dass etwas schief ging. Die Tatsache, dass die Ausführung nicht plötzlich aufhören auf Fehler können Sie orchestrieren graceful error-handling. Zum Beispiel, möchten Sie vielleicht, um führen Sie Korrekturmaßnahmen, wenn ein Fehler Auftritt.
Den code unten Ausschnitt aus Ihrer Frage setzt die Aufgabe, das Ergebnis zu scheitern (Linie 1) und beendet die Ausführung des tasks (Zeile 2).
Wenn die Aufgabe nicht Versagen/Ausführung ist nicht zu stoppen, dann ist das problem fast sicher ist in Bezug auf die
if
Bedingung, die steuert, ob der obige code ausgeführt wird (if (dtable.Rows.Count > 0)
)--irgendwie ist diese Bedingung nicht evaluieren zu true, wenn Sie es erwarten.Es ist auch möglich, dass das Skript Aufgabe ist scheitern aber einfach nicht so Aussehen, wie es. Was geschieht ist, dass das Skript Aufgabe auf einen Fehler, und schlägt fehl, und dann die Schleife beginnt eine neue iteration und führt das Skript aus Aufgabe für die nächste iteration. Das schnelle scheitern -> nächste iteration -> nächste Skript die Ausführung der Aufgabe machen könnte es so Aussehen, wie die Skript-Task bleibt im Status "wird ausgeführt" nach dem Versagen.
Wenn Sie möchten, dass die Tatsache, dass das Skript Aufgabe nicht zu verhindern, dass die Schleife eine weitere iteration, wirst du irgendwie wechseln müssen, die Schleife ist
ExecutionResult
zu Versagen. Sie könnten dies tun, indem Sie Ihr Skript AufgabeFailParentOnFailure
oder durch einstellen der loop istMaximumErrorCount
Immobilie niedrig genug, so dass die Fehler, die durch das Skript-Task-Fehler bewirkt, dass die Schleife istMaximumErrorCount
Schwellenwert erfüllt werden.Jungs, die ich figuered das problem heraus. Das Problem war ein deadlock im code mit dem InvalidFile variable.
Hinzugefügt:
den code und das Problem ist jetzt Weg. Mit GRÜßEN an @Ben Gribaudo der Kommentar ungültig Schleife gültig war, meine Kommentare im code, deuten solche.
Den stagnierenden variable wurde auch in einer onError-Aufgabe, bei der Sie eine E-Mail versandt wird. Da von der Variablen gesperrt in der Schleife für eine schreiben und das Skript Aufgabe eigentlich nie fehlschlagen, bis die onError abgeschlossen ist, wird die variable blieb gesperrt. Nach dem hinzufügen der
lock for one write
code, es funktioniert.Danke für Eure Hilfe, Erklärungen und Antworten.
Genau das, was ich suchte, verlassen Sie bei einem bestimmten Anruf zu einem SPROC gibt ein SQL-Fehler auf meinem Fang.