我使用的是VSTS 2008 + C#+ ADO.Net + SQL Server 2008.当从另一台远程计算机连接时,ADO.Net客户端通常使用TCP / IP协议连接到SQL Server 2008.在本地连接时(ADO.Net客户端和SQL Server在同一台机器上),通常使用共享内存或命名pipe道。
我的问题是,除了一般规则之外,如何精确地检查(例如,从某些SQL Server内置的命令/工具/存储过程?)特定连接使用的通信协议?
在此先感谢乔治
如果您有问题的进程的SPID(使用类似活动监视器或sp_who或sp_who2 ),那么您可以在服务器上执行此查询:
SELECT * FROM sys.dm_exec_connections WHERE session_id = (SPID);
用客户进程的实际SPIDreplace(SPID)。 看一下net_transport列,它会告诉你哪个进程正在使用哪个协议与SQL Server进行通信。 如果所有你感兴趣的是协议,只需使用SELECT net_transport而不是SELECT * 。
您还可以通过其他列过滤查询,例如client_net_address,对于TCP连接,它将是客户端计算机的IP地址。 您可以通过ADO.NET接口发送此查询。 SQL SMO可能也有一些东西。
这里是sys.dm_exec_connections的MSDN参考页面 。 请注意,您将需要服务器上的VIEW SERVER STATE权限才能看到更多的当前会话。
您还可以使用以下语法在连接string的server伪指令中指定传输协议:
server=[protocol]:servername
例子:
server=tcp:mysqlinstance1 (for TCP/IP) server=np:mysqlinstance1 (for named pipes) server=np:\\mysqlinstance1\pipe\pipename (for a specific pipe)
备注:TCP / IP或命名pipe道是传输层协议,表格数据stream是SQL Server中的通信(应用层)协议。