2012-12-28 1 views
3

ADO.NET 공급자와 트랜잭션을 사용해야합니다.Connection.CreateCommand()를 사용할 때 ADO.NET 트랜잭션을 명령 개체에 할당해야합니까?

다음은 생성되는 연결, 트랜잭션 및 명령의 간단한 예입니다. connection.CreateCommand()을 사용하여 명령을 만들 때 명령에 트랜잭션을 지정해야합니까? 또는, connection.CreateCommand() 대 명령 객체를 새로 작성하기 때문에 트랜잭션이 설정 되었습니까?

var connection = Database.GetConnection(); 
connection.Open(); 

var transaction = connection.BeginTransaction(); 

var command = connection.CreateCommand(); 
command.Transaction = transaction; // Is this line needed when using connection.CreateCommand()? 

* 업데이트 *

나는 두 개체의 참조를 테스트 할 때, 그들은 동일합니다. 나는 connection.CreateCommand()이 할당 된 트랜잭션과 함께 명령을 반환하고 있다고 가정합니다. 아니면 유효한 테스트가 아닐 수도 있습니다.

using (var connection = Database.GetConnection()) 
{ 
    connection.Open(); 

    var transaction = connection.BeginTransaction(); 

    var command = connection.CreateCommand(); 

    if (object.ReferenceEquals(transaction, command.Transaction)) 
     Debug.WriteLine("EQUAL"); 
} 
+0

우선 SQLTransaction 객체가 필요합니다. C# SQLTransaction에 대한 Google 검색을 시도해보십시오. 검색을 수행 할 시간이 필요하다면 여기를 클릭하십시오. StackOverFlow 또한 관련 항목을 살펴보십시오. 예를 들어이 페이지의 오른쪽에 링크가 있습니다. http://stackoverflow.com/questions/4688993/how-to-handle-sql-transaction-in-this-scenario – MethodMan

+0

'BeginTransaction()'은 트랜잭션을 반환합니다. http://msdn.microsoft.com/en-us/library/86773566.aspx –

+0

질문을 읽을 수있는 코드 블록으로 공식화 할 수 있습니까? – MethodMan

답변

0

예, 트랜잭션 및 명령은 서로 연관되어야합니다.

일부 편집 됨 샘플 코드 :

// Connect to the database. 
SqlConnection connection = new SqlConnection(Database.ConnectionString); 
connection.Open(); 

// Start a transaction. 
SqlCommand command = new SqlCommand(); 
command.Connection = connection; 
command.Transaction = connection.BeginTransaction(System.Data.IsolationLevel.Serializable, "ryan"); 

// Delete any previously associated targets. 
command.CommandType = System.Data.CommandType.StoredProcedure; 
command.CommandText = "FirstSP"; 
command.Parameters.AddWithValue("@Id", this.Id); 
command.ExecuteNonQuery(); 

// Add the specified targets to the product. 
command.CommandText = "SecondSP"; 
command.Parameters.Add("@Id", SqlDbType.Int); 
foreach (int Id in Ids) 
{ 
    command.Parameters["@Id"].Value = Id; 
    command.ExecuteNonQuery(); 
} 

// Commit the transaction. 
command.Transaction.Commit(); 

// Houseclean. 
connection.Close(); 
-1

이미 트랜잭션, 결과 명령 개체가 (명령의 트랜잭션 속성이 설정됩니다) 트랜잭션에 입대됩니다 시작 연결로, connection.CreateCommand를 사용하는 경우 .

new Command을 사용하는 경우 트랜잭션을 명시 적으로 설정해야합니다.

+0

귀하의 게시물 주셔서 감사합니다! 게시물에 서명/태그 라인을 사용하지 마십시오. 사용자 상자는 서명으로 간주되며 프로필을 사용하여 원하는 자신에 대한 정보를 게시 할 수 있습니다. [서명/태그 라인 FAQ] –

+0

슬프게도 트랜잭션을 명시 적으로 설정해야합니다. 매우 직관적이지는 않지만 [Microsoft는 설계 상입니다.] (https://connect.microsoft.com/VisualStudio/feedback/details/283583/sqlconnection-createcommand-doesnt-set-the-transaction-property-when-the- 연결 중 - 적극적으로 트랜잭션).[SqlConnection.CreateCommand 소스] (http://referencesource.microsoft.com/System.Data/R/6d218ea47afc988a.html)를 보면 쉽게 알 수 있겠지만 빠른 콘솔 앱으로이를 확인하는 것은 쉽지 않습니다. –

+0

예. 필자는 Oracle 11에서 SQL Server로 마이그레이션을 수행 한 후이 사실을 발견했습니다. Oracle 드라이버를 사용하면 명령에서 트랜잭션을 명시 적으로 설정할 필요가 없습니다. SQL Server 2012에서는 그렇지 않습니다! –

관련 문제