簡體   English   中英

如何通過不提交當前會話事務將DataTable作為參數傳遞給存儲過程?

[英]How to pass DataTable as a parameter to Stored Procedure by not commiting the current session transaction?

我的代碼如下所示:

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要求該命令具有事務。 該命令的Transaction屬性尚未初始化。

但是我不希望在完成整個操作之前提交事務。 我該如何實現?

問題在於,應該使用的事務已經提交並且已經被處置,因此,實例化新的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();
            }
        }
    }

順便說一句,為什么要使用SQLConnection,為什么不使用Nhibernate Session來執行查詢,您現在就可以使用Nhibernate Session來完成您正在做的所有事情。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM