gpt4 book ai didi

sql-server - 为什么我的 CONTEXT_INFO() 是空的?

转载 作者:行者123 更新时间:2023-12-02 15:26:52 24 4
gpt4 key购买 nike

我有一个方法来设置我的 linq 数据上下文。在返回 DC 之前,它会调用一个存储过程来设置 CONTEXT_INFO 值来标识当前用户。

触发器会拾取所做的任何更改,并使用此上下文数据写入审核记录。

我注意到我的上下文数据在审计表中是空白的,所以我编写了一个简单的单元测试来逐步完成这个过程,但我仍然什么也没得到。但是,如果我将所有 Linq-To-SQL 语句粘贴到查询窗口中,上下文数据就在那里。

查看探查器跟踪,它在此过程中进行了相当多的 sp_reset_connection 调用。我知道这些不应该对 CONTEXT_INFO 值产生影响。

那么这是怎么回事?

最佳答案

当您使用查询理解或 ExecuteQuery/ExecuteMethod 调用执行查询时,Linq to SQL DataContext 实际上并不保持连接打开,并且 CONTEXT_INFO 仅存在于单个连接的上下文中。

为了使其正常工作,您需要在设置 context_info 之前使用 context.Connection.Open() 手动打开 DataContext 上的连接。连接打开后,后续查询完成后不会自动关闭连接。

注意 - 这样做的技术原因是它会在设置了 CommandBehavior.CloseConnectionIDbCommand 上调用 ExecuteReader,除非连接已经建立打开。如果您使用具有相同标志集的 SqlCommand/IDbCommand 对象,您可以自己看到相同的行为。

编辑 - 我想我还应该指出,如果连接被池化,从技术上讲,物理连接始终“打开”,但 IDbConnection 仍然关闭,这就是导致连接重置。

关于sql-server - 为什么我的 CONTEXT_INFO() 是空的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2299712/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com