我正在使用 VSTS 2008 + C# + ADO.Net + SQL Server 2008。从另一台远程计算机连接时,ADO.Net 客户端通常使用 TCP/IP 协议连接到 SQL Server 2008。本地连接时(同一台计算机上的 ADO.Net 客户端和 SQL Server),通常使用共享内存或命名管道。
我的问题是,除了一般规则之外,如何准确检查(例如从一些 SQL Server 内置命令/工具/存储过程?)特定连接使用哪种通信协议?
提前致谢,乔治
答案1
如果您有该进程的 SPID(通过使用类似活动监视器或或sp_who
)sp_who2
,那么您可以在服务器上执行此查询:
SELECT *
FROM sys.dm_exec_connections
WHERE session_id = (SPID);
用客户端进程的实际 SPID 替换 (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 权限才能查看当前会话以外的内容。
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)
答案2
附注:TCP/IP 或命名管道是传输层协议,而表格数据流是 SQL Server 中的通信(应用层)协议。