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(); 
      } 
     } 
    } 

ところで、なぜあなたはNHibernateのセッションを使用してクエリをexexurtingアレントなぜ、あなたはNHibernateのセッションを使用して、今やっているすべてを行うことができたSQLConnectionを使用しています。

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

はいNhibernateセッションを使用しようとしましたが、ストアドプロシージャがテーブル値のパラメータを期待するため、どのようにパラメータとしてDataTableを渡しますか –

関連する問題