Mic*_*art 12 .net sql-server ado.net
我想使用SQL Server跟踪来跟踪有关使用数据库的代码的更多上下文.我打算在连接字符串上使用"Application Name"属性.看起来像下面这样:
object CallingObject; //set elsewhere
SqlConnectionStringBuilder connectionString = GetConnectionString();
connectionString.ApplicationName = CallingObject.GetType().ToString();
using (SqlConnection connection = new SqlConnection(connectionString.ToString()))
{
// do your thing
}
Run Code Online (Sandbox Code Playgroud)
除了大量的结果连接字符串意味着.net的连接池不再有效.
如何在不损失连接池优势的情况下跟踪SQL跟踪中的调用代码?
只要您使用 SQL Server,并且只要您拥有(或可以拥有)集中式连接创建逻辑,您就可以使用该CONTEXT_INFO功能:http ://msdn.microsoft.com/en-us/library/ms187768 .aspx
我们执行类似的操作来跟踪多用户服务器端应用程序中的数据库连接。每次创建新的数据库连接(实际上是从连接池中重用,但在 ADODB/ADO.Net 代码中“创建”):
DECLARE @ContextInfoBinary binary(128);
SET @ContextInfoBinary = Convert(Binary(128), 'XX' + Replicate(Char(0), 36) + 'Up to 90 characters of connection info - username, page, action, etc')
SET CONTEXT_INFO @ContextInfoBinary
Run Code Online (Sandbox Code Playgroud)
稍后,当您想要“跟踪”连接时,可以将 context-info 的指定范围转换回 VarChar 内容:
SELECT RTRIM(hostname) AS hostname
, hostprocess
, RTRIM(program_name) AS program_name
, CASE
WHEN SubString(Context_Info, 1, 2) = 0x5858
THEN Replace(Convert(VarChar(90), SubString(Context_Info, 39, 90)), CHAR(0), '')
ELSE 'UNKNOWN'
END AS ExtendedConnectionDescription
--More stuff here, depending on what you're looking for
FROM master.sys.sysprocesses
Run Code Online (Sandbox Code Playgroud)
一些注意事项:
sp_trace_generateevent,如以下相关问题中所述:How do you access the Context_Info() variable in SQL2005 Profiler? 更新:
只有在重新阅读您的问题后,我才意识到您似乎明确希望仅向跟踪添加信息,而不是对当前连接进行临时分析(这更多的是我与“应用程序名称”的使用相关联)与,抱歉);我见过的唯一有用的方法是调用sp_trace_generateevent。如果您打算这样做,我建议您还添加connection_info,因为它不会再花费您更多的费用(您已经有了 的 db 往返sp_trace_generateevent)并且肯定会帮助您进行其他类型的分析稍后的。
| 归档时间: |
|
| 查看次数: |
1662 次 |
| 最近记录: |