2016-11-11 5 views
1

Я новичок в ADO, поэтому я хочу спросить, правильно ли я использовал транзакцию. Вот фрагмент кодаИспользование транзакции в ADO.net SQL

string SQL1 = "INSERT INTO tbl_cust(cust_id,cust_name) values ('000001','YoungMcD') "; 
string SQL2 = "UPDATE tbl_cust SET custname='OldMcDonald' WHERE cust_id='000001'"; 
string SQL3 = "SELECT * FROM tbl_supplier WHERE supplier_code ='000001'"; 

// write connstring 
string conn = System.Configuration.ConfigurationManager.ConnectionStrings["connstr"].ConnectionString; 
// end of connection string 

// setting connection 
SqlConnection db = new SqlConnection(conn); 
SqlTransaction transaction1; 

db.Open(); 
transaction1 = db.BeginTransaction(); 

try 
{ 
    // insert to table 
    SqlCommand Com1 = new SqlCommand(SQL1, db, transaction1); 
    Com1.ExecuteNonQuery(); 

    SqlCommand Com2 = new SqlCommand(SQL2, db, transaction1); 
    Com2.ExecuteNonQuery(); 

    SqlCommand Com3 = new SqlCommand(SQL3, db, transaction1); 
    Com3.ExecuteNonQuery(); 

    transaction1.Commit(); 

    db.Close(); 
} 
catch 
{ 
    transaction1.Rollback(); 
    db.Close(); 
    msg = "error"; 
    goto endret; 
} 

Для сделки, я должен использовать

SqlCommand Com1 = new SqlCommand(SQL1, db, transaction1); 

вместо

SqlCommand Com1 = new SqlCommand(SQL1, db); 

, потому что я уже констатировать начать транзакцию перед try{} заявления

EDIT:

Я понимаю, первый синтаксис применим, но как эффективно использовать ADO ?. Я считаю, что этот путь слишком прост.

я обнаружил, что продолжать это делать для вставки параметра, пример:

string SQL1 = "INSERT INTO tbl_cust(cust_id,cust_name) values ('" + param1 +"','"+ param2 +"') "; 
+0

Вам необходимо использовать первую, чтобы указать sql, с какой транзакцией принадлежит команда, так как вы могли одновременно выполнять несколько транзакций. – garethb

+0

Обратите внимание, что пока это будет работать, вы фактически совершаете 5 раундов между вашим приложением и сервером sql. Те же действия могут быть выполнены только с одной поездкой в ​​оба конца с использованием хранимой процедуры. –

+0

Могу ли я попросить объяснение того, что вы имеете в виду в совершении 5-ти круговых поездок? потому что я этого не понимаю, и почему это хуже, чем создание хранимой процедуры. – KokoriNut

ответ

2

Вы должны использовать одну команду, а также обернуть соединение в блоке Использование поэтому его утилизировать. Кроме того, вы должны прочитать tbl_supplier после совершения транзакции, выполнив команду SqlDataReader. Я предполагаю, что вам просто нужно знать, сколько строк было затронуто после совершения транзакции.

Это упрощенная версия вашего кода.

var conn = System.Configuration.ConfigurationManager.ConnectionStrings["connstr"].ConnectionString; 
string SQL1 = "INSERT INTO tbl_cust(cust_id,cust_name) values ('000001','YoungMcD') "; 
string SQL2 = "UPDATE tbl_cust SET custname='OldMcDonald' WHERE cust_id='000001'"; 

using (SqlConnection connection = new SqlConnection(conn)) 
{ 
    connection.Open(); 
    SqlTransaction sqlTran = connection.BeginTransaction(); 
    SqlCommand command = connection.CreateCommand(); 
    command.Transaction = sqlTran; 

    try 
    { 
     command.CommandText = SQL1; 
     int rowsAffected = command.ExecuteNonQuery(); 
     command.CommandText = SQL2; 
     rowsAffected += command.ExecuteNonQuery(); 
     transaction.Commit(); 
    } 
    catch (Exception ex1) 
    { 
     // Attempt to roll back the transaction. 
     try 
     { 
      transaction.Rollback(); 
     } 
     catch (Exception ex2) 
     { 
      // This catch block will handle any errors that may have occurred 
      // on the server that would cause the rollback to fail, such as 
      // a closed connection. 
     } 
    } 
} 
+0

Удалите откат. – usr

+0

Сделка действительно должна быть в блоке 'using'. Кроме того, с порядком вашего кода, я не думаю, что команда будет зачислена в транзакцию. –

+0

@ScottChamberlain Я согласен, что транзакция в блоке использования будет более элегантной. Не уверен в вашей второй точке. Что случилось с заказом? Не следует. –

Смежные вопросы