0

내 코드는 다음과 같습니다현재 세션 트랜잭션을 커밋하지 않음으로써 DataTable을 저장 프로 시저에 매개 변수로 전달하는 방법?

public void InsertSampleData(DataTable tempTable) 
    { 
     session.Transaction.Commit(); 
     var connection = session.GetSessionImplementation().Connection; 
     using (var sqlConnection = (SqlConnection)connection) 
     { 
      using (var cmd = sqlConnection.CreateCommand()) 
      { 
       cmd.CommandType = CommandType.StoredProcedure; 
       cmd.CommandText = "dbo.insertData"; 
       cmd.Parameters.Add("@sItems", SqlDbType.Structured); 
       var sqlParam = cmd.Parameters["@Items"]; 
       sqlParam.Direction = ParameterDirection.Input; 
       sqlParam.TypeName = "[dbo].[DataItemType]"; 
       sqlParam.Value = tempTable; 
       cmd.ExecuteNonQuery(); 
      } 
     } 
    } 

코드는 잘 작동하지만 트랜잭션을 커밋하지 않는 경우가

System.InvalidOperationException를 같이 예외가 발생합니다 : ExecuteNonQuery는이이 명령을 요구를 명령에 할당 된 연결이 보류중인 로컬 트랜잭션에있을 때 트랜잭션. 명령의 트랜잭션 특성 이 초기화되지 않았습니다.

그러나 전체 작업을 완료하기 전에 트랜잭션을 커밋하지 않으려합니다. 나는 이것을 어떻게 얻을 수 있을까 ??

+0

GetSessionImplementation은 무엇을 반환합니까? – Baz1nga

+0

@ Baz1nga는 [ISession] (http://mausch.github.com/nhibernate-3.2.0GA/html/fcb2b8a0-0c03-8056-91a1-3b26691eaffe.htm)을 구현 한 것을 반환합니다. nhibernate 일 –

+0

NHibernate.Engine .ISessionImplementor GetSessionImplementation() NHibernate.ISession의 구성원 요약 : 세션 구현을 가져옵니다. 반환 값 : NHibernate.Engine.ISessionImplementor 인터페이스 비고 NHibernate에 구현 : 이 방법은 래퍼 implementions에서 세션의 NHibernate에 구현을 얻기 위해 제공됩니다. NHibernate.ISession 인터페이스의 구현자는이 메소드의 NHibernate 구현을 리턴해야한다. –

답변

1

트랜잭션이 커밋되고 이미 삭제되었으므로 새 SqlConnection을 인스턴스화하거나 새 세션을 가져온 다음 새 세션의 일부로 쿼리를 실행해야합니다.

public void InsertSampleData(DataTable tempTable) 
{ 
    session.Transaction.Commit(); 

    using (var sqlConnection = new SqlConnection(session.GetSessionImplementation() 
             .Connection.ConnectionString)) 
    { 
     using (var cmd = sqlConnection.CreateCommand()) 
     { 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.CommandText = "dbo.insertData"; 
      cmd.Parameters.Add("@sItems", SqlDbType.Structured); 
      var sqlParam = cmd.Parameters["@Items"]; 
      sqlParam.Direction = ParameterDirection.Input; 
      sqlParam.TypeName = "[dbo].[DataItemType]"; 
      sqlParam.Value = tempTable; 
      cmd.ExecuteNonQuery(); 
     } 
    } 
} 

또는

public void InsertSampleData(DataTable tempTable) 
    { 
     session.Transaction.Commit(); 
     var connection = session.SessionFactory.OpenSession().GetSessionImplementation().Connection; 
     using (var sqlConnection = (SqlConnection)connection) 
     { 
      using (var cmd = sqlConnection.CreateCommand()) 
      { 
       cmd.CommandType = CommandType.StoredProcedure; 
       cmd.CommandText = "dbo.insertData"; 
       cmd.Parameters.Add("@sItems", SqlDbType.Structured); 
       var sqlParam = cmd.Parameters["@Items"]; 
       sqlParam.Direction = ParameterDirection.Input; 
       sqlParam.TypeName = "[dbo].[DataItemType]"; 
       sqlParam.Value = tempTable; 
       cmd.ExecuteNonQuery(); 
      } 
     } 
    } 

BTW, 당신은 NHibernate에 세션을 사용하여 쿼리를 exexurting이 arent 이유에는 SQLConnection을 사용하는 이유는, 당신이 NHibernate에 세션을 사용하여 바로 지금하고있는 모든 것을 할 수 있습니다.

session.CreateSQLQuery(<your sql>) 
.SetParameters() //and various other API to set your parameters 
.ExecuteUpdate(); 
+0

예 Nhibernate 세션을 사용해 보았습니다. 그러나 저장 프로 시저가 테이블 값 매개 변수를 필요로하기 때문에 매개 변수로 DataTable을 전달하는 방법은 무엇입니까? –

관련 문제