Die sauberste Art, BeginTransaction mit try catch zu verwenden
Bis jetzt verwende ich zwei Try-Catch-Blöcke für meine Abfragen. Der erste gibt einen Fehler aus, wenn die Verbindung nicht hergestellt wird. Der zweite prüft, ob er SqlCommand
erfolgreich ausgeführt wurde. Wie im folgenden Beispiel
try
{
using(varconnection=newSqlConnection())
using(varcmd=newSqlCommand())
{
connection.Open();
var transaction=connection.BeginTransaction();
cmd.Connection=connection;
cmd.Transaction=transaction;
try
{
cmd.CommandText="InsertintoCustomers(Name)values('Dimitri')";
cmd.ExecuteNonQuery();
cmd.CommandText="InsertintoCustomers(Name)values('George')";
cmd.ExecuteNonQuery();
transaction.Commit();
}
catch
{
try{transaction.Rollback();}catch{}
}
}
}
catch
{
}
Ich habe ein zweites Beispiel gefunden, das für mich klarer aussieht.
SqlTransactiontransaction=null;
using(varconnection=newSqlConnection())
using(varcmd=newSqlCommand())
{
try
{
connection.Open();
transaction=connection.BeginTransaction();
cmd.Connection=connection;
cmd.Transaction=transaction;
cmd.CommandText="InsertintoCustomers(Name)values('Dimitri')";
cmd.ExecuteNonQuery();
cmd.CommandText="InsertintoCustomers(Name)values('George')";
cmd.ExecuteNonQuery();
transaction.Commit();
transaction.Dispose();
transaction=null;
}
catch
{
if(transaction!=null)
{
try{transaction.Rollback();}catch{}
}
}
}
Haben beide das gleiche Ergebnis? Welcher von zwei ist vorzuziehen?
Antworten
Keine dieser beiden Methoden ist gut. Sie sind zu ausführlich.
Die beste Methode ist, einfach das Transaction
in ein zu setzen using
, außerdem sollten wir einen Parameter für die Abfrage verwenden:
using(var connection = new SqlConnection(connString))
using(var cmd = new SqlCommand("Insert into Customers (Name) values (@Name));"))
{
var param = cmd.Parameters.Add("@Name", SqlDbType.VarChar, insert_column_length_here);
connection.Open();
using(var transaction = connection.BeginTransaction())
{
cmd.Transaction = transaction;
param.Value = "Dimitri";
cmd.ExecuteNonQuery();
param.Value = "George";
cmd.ExecuteNonQuery();
transaction.Commit();
}
}
Wir können sehen, dass das Entsorgen des Transaktionsobjekts automatisch zurückgesetzt wird, wenn es nicht bereits festgeschrieben wurde, indem wir uns den Quellcode ansehen . Also using
wird alles aufräumen.
Wenn Sie abfangen müssen, um dem Benutzer eine Nachricht anzuzeigen, tun Sie dies außerhalb des Codes, dh setzen Sie ein Umlauf try/catch
um das Ganze. Machen Sie den Bereinigungscode nicht selbst