【问题标题】:Why is my CONTEXT_INFO() empty?为什么我的 CONTEXT_INFO() 是空的?
【发布时间】:2010-02-19 21:26:15
【问题描述】:

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

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

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

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

那么这里发生了什么?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 这就是我喜欢堆栈溢出的原因。你刚刚帮助我避免了一个悲惨的周末。谢谢,我会调查的。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-16
      • 2011-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多