从MSDN:


  在使用SqlDataReader时,关联的SqlConnection忙于为SqlDataReader提供服务,除了关闭SqlConnection之外,不能对SqlConnection进行任何其他操作。在调用SqlDataReader的Close方法之前,情况就是这样。例如,只有在调用Close之后才能检索输出参数。


a)为什么您不能使用SqlConnection?毕竟,当ExecuteQuery()返回SqlDataReader对象时,已经从数据库中检索并填充了SqlDatareader对象。因此,我看不到SqlConnection如何还是为什么仍要提供SqlDataReader对象?

b)更重要的是,出于什么原因,在SqlDataReader上调用Close()之前检索输出参数是个坏主意吗?

c)当上面的引用提到无法在SqlConnection上执行其他任何操作时,它想到的是什么操作?只是那些需要连接到远程SQL Server的用户,或者我们不能使用SqlConnection实例的任何成员?

最佳答案

a)返回ExecuteReader时,尚未在读取器中检索并填充所有数据,但仍可能从数据库流回该数据。这就是SqlDataReader的重点,因为执行此操作比将其全部加载更有效。

b)由于表格数据流(TDS)协议的结构方式,您直到阅读器完成后才能检索输出参数。直到结果集数据之后,才将输出参数物理地向下发送。

c)这意味着除Close之外的所有操作均未记录为保证能正常工作。他们是否实际工作无关紧要,因为这是实现细节而不是合同,而根据实现细节进行编程是灾难的根源。

为什么仍然要重用连接? SqlConnection使用的连接存储在幕后,因此,当您布置一个连接时,并没有真正摆脱所有资源,它只是将连接返回到池中。这意味着您可以在最短的时间内使用连接,理想情况下是在using块内使用,而不必担心这种情况。只需在需要时创建一个新连接,而不必费心尝试重新使用它们,因为它已经在幕后发生。

关于c# - 为什么在关闭SqlDataReader之前不能使用SqlConnection实例?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/593160/

10-10 21:40