2016-11-11 9 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; 
} 

に、私はすでにtry{}文の前

EDITトランザクションを開始述べるので、私は

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

代わりの

SqlCommand Com1 = new SqlCommand(SQL1, db); 

を使用する必要があります。

私はそれを得る、最初の構文は適用できますが、効果的にADOを使用する方法?私はこの方法があまりにも簡単だとわかります。

私は自分自身の元、パラメータを挿入するためにこれをやり続けるが見つかりました:

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

複数のトランザクションを同時に処理できるので、コマンドにどのトランザクションが属しているかをsqlに知らせる必要があります。 – garethb

+0

これは動作しますが、実際にはアプリケーションとSQL Serverの間で5回の往復を行っています。同じアクションは、ストアドプロシージャを使用して1回のラウンドトリップで完了することができます。 –

+0

私は5回の往復をすることについて何を意味するのかを説明することができますか?なぜなら、これはストアドプロシージャを作成するよりも劣るからです。 – KokoriNut

答えて

2

1つのコマンドを使用しても、そのが適切に配置されたように、使用ブロックに接続をラップする必要があります。さらに、SqlDataReaderを実行してトランザクションがコミットされた後、tbl_supplierから読み取る必要があります。私はトランザクションがコミットされた後に影響を受ける行の数を知りたいと仮定しています。

コードの簡略化したバージョンです。

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私は、トランザクションをより使いやすいブロックにすることに同意します。あなたの第2のポイントについてはわからない。注文に間違いがありますか?フォローしていない。 –

関連する問題