从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/