为什么我的CONTEXT_INFO()为空?

时间:2010-02-19 21:26:15

标签: sql-server asp.net-mvc linq-to-sql

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

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

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

查看分析器跟踪,它在此过程中进行了大量的sp_reset_connection调用。我已经明白这些不应该对CONTEXT_INFO值产生影响。

那么这里发生了什么?

2 个答案:

答案 0 :(得分:9)

Linq to SQL DataContext在执行查询时实际上不会打开连接,使用查询理解或ExecuteQuery / ExecuteMethod调用,而CONTEXT_INFO只能生命在单一连接的背景下。

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

注意 - 技术原因是它会在ExecuteReader设置IDbCommand时调用CommandBehavior.CloseConnection,除非连接已经打开。如果您使用具有相同标志集的SqlCommand / IDbCommand个对象,则可以自己查看相同的行为。

编辑 - 我想我还应该指出,如果连接是池,从技术上讲,物理连接一直是“打开”,但IDbConnection仍然关闭,这是导致连接重置的原因

答案 1 :(得分:3)

sp_reset_connection会重置context_info。 sp_reset_connection是回收连接时客户端应用程序池调用的过程,因此您似乎在一个连接上发布上下文,关闭连接并期望在新连接上设置上下文,这显然是错误的。 / p>