关于.net:共享的SqlConnection

Shared SqlConnection

在.NET应用程序中有一个共享的SqlConnection对象用于所有数据库连接是一种好习惯吗?还是每次访问数据库时都应该有一个单独的SqlConnection对象?

我目前有一个共享对象,似乎突然遇到了问题。当我需要使用SQL身份验证模式而不是Windows身份验证模式时,似乎无法使用共享模式。我只是第一次尝试使用SQL身份验证,当我第二次尝试使用相同的连接时,它给了我这个错误:

已经有与此命令关联的打开的DataReader,必须先关闭它。


您应该真正有一个单独的人。重用连接是通过连接池来处理的。像其他人所说的那样,第二个问题可以通过启用MARS来解决。


该错误与身份验证完全无关。在关闭从ExecuteReader()返回的SqlDataReader之前,您正在重用中间的连接。这是禁止的。您必须检查代码并消除问题。有使用MARS(多个活动记录集)的替代方法,但我强烈不建议这样做。

在应用程序中使用多个连接可能会更糟,因为显然您不知道正在使用什么连接以及何时使用,因此,当您使用单独的连接时,会遇到事务一致性问题。


您的问题是您试图使用SqlDataReader当前正在使用的连接。你不能那样做。当使用SqlDataReader时,必须在重新使用正在使用的连接之前将其关闭。我建议您每次访问数据库时都创建一个不同的连接(任何时候,不仅限于SqlDataReaders)。如果启用了池,则框架本身(或者是SqlServer?)将在可能的情况下重用连接。

如果您需要顺序访问数据库,则假设您先进行选择,然后再进行另一个选择,然后进行更新,则可以重用该连接(我的意思是,相同的SqlConnection实例),但是如果您需要访问DB从SqlDataReader读取时,则需要2个不同的连接。

当然,您必须考虑并发问题。如果使用事务,则某些记录可能在某些操作期间被锁定,并且当您将SqlDataReader与其他查询并行使用时,应将隔离级别设置为不会与其余查询混淆的级别。


很多可能是这里的dup;简而言之,在大多数情况下,请保持短暂的连接和本地连接。重新读数据;也许启用MARS?


虽然对于单个线程,使用单个SqlConnection对象可能会更好,但是它会通过挂在连接上来对作为数据库服务器的宝贵资源提出要求,从而使数据库服务器资源的使用时间长于所需时间。铅>

最好在尽可能短的时间内实例化SqlConnection。连接池减轻了建立连接的大部分费用,并确保最有效地利用数据库资源。


如果您使用的是SQL Server 2000,这可能会回答您的问题。

那里的获胜答案似乎是"这是由于MARs的默认设置发生了变化。它默认情况下处于启用状态,而在RC1之后,我们默认将其更改为关闭。因此,只需更改您的连接字符串以添加回来(将MultipleActiveResultSets = True添加到连接字符串)。"