try catch를 사용하여 BeginTransaction을 사용하는 가장 깨끗한 방법
지금까지 쿼리에 대해 두 개의 try catch 블록을 사용하고 있습니다. 첫 번째는 연결이 설정되지 않은 경우 오류를 발생시킵니다. 두 번째 SqlCommand
는 성공적으로 실행되었는지 확인합니다 . 아래 예와 같이
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
{
}
더 명확 해 보이는 두 번째 예제를 찾았습니다.
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{}
}
}
}
둘 다 동일한 결과를 가지고 있습니까? 두 가지 중 어느 것이 더 바람직합니까?
답변
2 Charlieface
이 두 가지 방법 중 어느 것도 좋지 않습니다. 너무 장황합니다.
가장 좋은 방법은 단지를 배치하는 것입니다 Transaction
A의 using
또한 우리가 쿼리에 대한 매개 변수를 사용해야합니다,뿐만 아니라 :
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();
}
}
트랜잭션 객체를 폐기 하면 소스 코드를 살펴보면 아직 커밋되지 않은 경우 자동으로 롤백됩니다 . 그래서 using
모든 것을 정리할 것입니다.
사용자에게 메시지를 표시하기 위해 포착해야하는 경우 코드 외부 에서 수행합니다. 즉 try/catch
, 전체를 둘러 쌉니다. 정리 코드를 직접 수행하지 마십시오.