Frage

  1. Ich habe SQL Server 2000, nicht MultipleActiveResults nicht unterstützt.
  2. Ich habe mehrere Einsätze zu tun, und es ist mit einer Verbindung pro Einfügung erfolgen.
  3. Ich möchte eine Transaktion vor allen Einfügungen beginnen und es nach allen Einfügungen zu beenden.
  4. Wie kann ich es tun?
War es hilfreich?

Lösung

Was ist der Grund, warum Sie eine Verbindung und mehrere Befehle nicht verwenden (eigentlich ein Befehl in der Schleife neu)? Vielleicht wird diese Lösung für Sie arbeiten:

   public static void CommandExecNonQuery(SqlCommand cmd, 
       string query, SqlParameter[] prms)
    {
        cmd.CommandText = query;
        cmd.Parameters.AddRange(prms);
        cmd.ExecuteNonQuery();
        cmd.Parameters.Clear();
    }

    static void Main(string[] args)
    {
        string insertQuery = 
           @"INSERT TESTTABLE (COLUMN1, COLUMN2) " + 
             "VALUES(@ParamCol1, @ParamCol2)";
        using (SqlConnection connection = 
          new SqlConnection(connectionString))
        {
            using (SqlCommand command = 
              connection.CreateCommand())
            {
                SqlTransaction transaction = null;
                try
                {
                    // BeginTransaction() Requires Open Connection
                    connection.Open();

                    transaction = connection.BeginTransaction();

                    // Assign Transaction to Command
                    command.Transaction = transaction;
                    for (int i = 0; i < 100; i++)
                        CommandExecNonQuery(command, insertQuery, 
                          new SqlParameter[] { 
                            new SqlParameter("@ParamCol1", i), 
                            new SqlParameter("@ParamCol2", i.ToString()) });
                    transaction.Commit();
                }
                catch
                {
                    transaction.Rollback();
                    throw;
                }
                finally
                {
                    connection.Close();
                }
            }
        }
    }

Siehe auch
SQL Server-Transaktionen - ADO.NET 2.0 - Commit und Rollback - Verwenden Statement - IDisposable

Andere Tipps

Sie haben nicht angeben, wenn Sie .NET 2.0 verwenden sind, aber ich werde diese Annahme machen. C # 3.0 Beispielcode wird im Folgenden aufgeführt:

using (var tx = new TransactionScope()) {
    // Execute multiple DB statements inside here
    ts.Complete();
}

Wenn eines der DB-Anweisungen fehlschlägt, wird die ts.complete nie und die Transaktion erreicht werden wird am Ende der Anweisung using automatisch zurückgerollt werden. Eine Einschränkung dieses Ansatzes ist jedoch, dass Sie die DTC am Ende dann nutzen, wenn Sie mehrere Verbindungen verwenden, die langsamer Leistung bedeutet.

Herausgegeben SqlTransaction zu Transaction ändern

Ein Beispiel eine einzelne SQL-Verbindung zwingt die DTC zu vermeiden, mit:

using (var tx = new TransactionScope())
using (var db = new SqlConnection(connString)) {
    // Command 1
    using (var cmd = db.CreateCommand()) {
        cmd.CommandText = "select...";
        using (var reader = cmd.ExecuteReader()) {
           // Process results or store them somewhere for later
        }
    }

    // Command 2
    using (var cmd = db.CreateCommand()) {
        cmd.CommandText = "select...";
        using (var reader = cmd.ExecuteReader()) {
           // Process results or store them somewhere for later
        }
    }

    // Command 3
    using (var cmd = db.CreateCommand()) {
        cmd.CommandText = "select...";
        using (var reader = cmd.ExecuteReader()) {
           // Process results or store them somewhere for later
        }
    }
    tx.Complete();
}

Die Transaktionen werden über eine Verbindung erstellt und haben keinen Raum über die Verbindung, die sie auf erstellt werden, so können Sie dies nicht tun, was Sie fordern. Umgestalten, so dass Sie die Einsätze nacheinander auf eine Verbindung ausführen können und nicht gleichzeitig oder einen anderen Mechanismus implementieren Zurückkehren zu erreichen (zB eine Tabelle des eingefügten Schlüssels, die als einen aufblick verwendet werden können, um eingefügte Datensätze zu löschen, wenn ein Fehler später in dem festgestellt wird Verfahren)

Ich glaube nicht eine Transaktion mehrere Verbindungen umfassen kann.

Was ist die Begründung für die vielfältigen Einsätze in separaten Verbindungen zu tun? Ich würde denken, dass Sie sie in einer einzigen Verbindung wollen würden normalerweise.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top