strongmonkey
@strongmonkey

Как исправить ошибку System.Data.SqlClient.SqlException: Transaction context in use by another session?

задача:

на стороне sql открыта транзакция внутри которой что то происходит.
внутри этой транзакции нужно вызвать clr процедуру на C# которая что то куда то запишет
и в случае отката транзакции, действия которые были выполнены в процессе работы clr функции
не должны откатится.

для теста накидал метод на C#

namespace Future.SQLCLR
{
    public class Exception
    {
        public static string ConnectionString
        {
            get
            {
                //string ret = "context connection = true";//
                string ret = "Data Source = server; Initial Catalog = database; Integrated Security = True";
                return ret;
            }
        }


        [SqlFunction()]
        public static void TestInsert(SqlString inputParam)
        {
            using (var cn = new SqlConnection(ConnectionString))
            {
                try
                {
                    cn.ConnectionString = "Enlist=false";

                    cn.Open();
                    
                    var cmd = new SqlCommand("insert into table(field)" +
											 "select field from table_1", cn);

                    cmd.ExecuteNonQuery();
                }
                catch (System.Exception)
                {

                    throw;
                }
                finally
                {
                    cn.Close();
                }
            }
        }
    }
.......
}


CREATE PROCEDURE [audit].[TestInsert]
(
	@msg   nvarchar(2048)
)
AS EXTERNAL NAME CLR.[SQLCLR.Exception].TestInsert

begin tran

exec [TestInsert] 'msg'

rollback

получаю ошибку System.Data.SqlClient.SqlException: Transaction context in use by another session.
  • Вопрос задан
  • 586 просмотров
Пригласить эксперта
Ответы на вопрос 1
dmitry_pavlov
@dmitry_pavlov
World-class .NET freelance contractor (remotely)
Смущает описание хранимой процедуры - это ее часть какая-то? Или что это такое?

CREATE PROCEDURE [dbo].[MyPROC]
(
  @Param1 nvarchar(2048) out,
  @Param2 int out,
  @Param3 int out,
  @Param4 int
)
AS EXTERNAL NAME DWH_CLR.[Future.SQLCLR.Exception].HandleException
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы