Angenommen, ich verwende C#, um eine lange gespeicherte SQL Server-Prozedur auszuführen (etwa 30 Minuten). Nehmen wir weiter an, dass ich die Abfrage in C# mit einer 1-Stunden-Timeout-Periode versehen habe, so dass ich, wenn dieser SP aus irgendeinem Grund länger als erwartet dauert, die DB nicht monopolisieren werde. Nehmen wir zum Schluss an, dass diese gespeicherte Prozedur einen try/catch-Block enthält, um Fehler zu erkennen und eine Bereinigung durchzuführen, falls irgendwelche Schritte darin fehlschlagen sollten.Was macht SQL Server mit einer zeitgesteuerten Anfrage?
Einige Code (C#):
using (SqlCommand comm = new SqlCommand("longrunningstoredproc"))
{
comm.Connection = conn;
comm.CommandType = CommandType.StoredProcedure;
comm.CommandTimeout = 3600;
comm.ExecuteNonQuery();
}
/* Note: no transaction is used here, the transactions are inside the stored proc itself. */
T-SQL (beträgt grundsätzlich folgende):
BEGIN TRY
-- initiailize by inserting some rows into a working table somewhere
BEGIN TRANS
-- do long running work
COMMIT TRANS
BEGIN TRANS
-- do long running work
COMMIT TRANS
BEGIN TRANS
-- do long running work
COMMIT TRANS
BEGIN TRANS
-- do long running work
COMMIT TRANS
BEGIN TRANS
-- do long running work
COMMIT TRANS
-- etc.
-- remove the rows from the working table (and set another data point to success)
END TRY
BEGIN CATCH
-- remove the rows from the working table (but don't set the other data point to success)
END CATCH
Meine Frage ist, was wird SQL Server mit der Abfrage zu tun, wenn der Befehl Zeiten von der C# -Seite aus? Wird es den catch-Block des SP aufrufen, oder schneidet es es einfach so ab, dass ich die Bereinigung im C# -Code durchführen müsste?
Der Befehl wird nicht von der C# Website Timeout - Die Datenbank wird es eine Zeitüberschreitung. Der C# -Code hat keine Kontrolle darüber (der DB wurde gesagt, dass er nach 1 Stunde Timeout hat, und die DB tut genau das). – Oded