ADO.NET 的 DataReader 是否与 SQL Server 对其获取的每一行进行交互,或者是否维护缓存或缓冲区?

问题描述 投票:0回答:1

我已经使用 datareader 从 SqlServer 读取数据...现在让我们说...表中有 20 行...那么我的 ADO.NET 是否与 sql 服务器进行 20 次交互来获取数据或它是否一次性将所有数据存储在我的本地计算机缓存中...

using (SqlCommand command = new SqlCommand(stmt, instance))
            {
                using (SqlDataReader reader = command.ExecuteReader())
                {
                      while (reader.Read())
                      {
                              //perform operations
                      }
                }
            }

所有这些混乱都出现了,当您在 “while(reader.Read())” 关闭连接时...我们会得到一个异常...所以我的理解是它与服务器交互 20 次,但它是对性能造成很大影响......所以我假设ADO.NET可能使用将所有这20行存储在本地计算机缓存中......并从那里逐行读取......如果是这种情况......为什么这样做当我们关闭连接时抛出异常?

.net ado.net datareader
1个回答
0
投票

SqlClient(旧的

System.Data
和新的
Microsoft.Data
)使用 TDS 协议

TDS 协议以“消息”、“令牌”和“数据包”的形式工作,客户端逻辑通常按顺序处理这些数据(即一次拉入下一个数据包)。服务器和客户端使用消息(可能包含也可能不包含令牌流)进行通信,并且这些消息被分成数据包以进行物理传输。

消息的类型有很多种,但

Row Data
消息是一个令牌流,由列定义令牌组成,后面是实际的行数据令牌。该数据可能(并且通常)跨越多个数据包。实际的行不一定是每个数据包一个,它们可以重叠或在一个数据包中存在多个。

由于这一切都是通过 TCP 完成的,因此通常还存在中间缓冲区,无论是在用户模式(您的应用程序)、内核/驱动程序还是网卡本身,甚至可能还有交换机和路由器。

© www.soinside.com 2019 - 2024. All rights reserved.