Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 共享SqlConnection_.net_Sql Server - Fatal编程技术网

.net 共享SqlConnection

.net 共享SqlConnection,.net,sql-server,.net,Sql Server,在.NET应用程序中有一个共享的SqlConnection对象用于所有数据库连接是一种好的做法,还是每次访问数据库时都应该有一个单独的SqlConnection对象 我现在有一个共享的,似乎突然遇到了问题。当我需要使用SQL身份验证模式而不是Windows身份验证模式时,似乎无法使用共享身份验证。我第一次尝试使用SQL身份验证,第二次尝试使用相同的连接时,它给了我以下错误: 已经有一个与此命令关联的打开的DataReader,必须先关闭它。如果您使用的是SQL Server 2000,可能会回答

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

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


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

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


获胜的答案似乎是“这是因为MARs的默认设置发生了变化。它在默认情况下是打开的,我们在RC1后将其默认更改为关闭。因此,只需更改您的连接字符串以将其添加回(将MultipleActiveResultSets=True添加到连接字符串)。”

这其中很多可能是错误的;简而言之,在大多数情况下,保持连接的短期性和本地性。重新设计数据读取器;可能启用?

对于单个线程,使用单个SqlConnection对象可能会更好,但它通过挂起连接,从而延长数据库服务器资源的使用时间,从而对宝贵的数据库服务器资源提出了需求


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

该错误与身份验证完全无关。在关闭从ExecuteReader()返回的SqlDataReader之前,您正在重用中间的连接。这是禁止的。您必须检查代码并消除问题。使用MARS()还有其他选择,但我强烈反对这样做


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

你真的应该有一个单独的。重用连接的处理方法是。第二个问题,就像其他人所说的,可能可以通过启用MARS来解决。

您的问题是,您正在尝试使用SqlDataReader当前正在使用的连接。你不能那样做。使用SqlDataReader时,必须先将其关闭,然后再重新使用正在使用的连接。我建议您在每次访问DB时创建一个不同的连接(任何时候,而不仅仅是使用SqlDataReaders)。如果启用了池,那么框架本身(或者是SqlServer?)将在可能的情况下重用连接

如果您需要按顺序访问数据库,比如说您进行了一次选择,然后进行了另一次选择,然后进行了一次更新,您可以重用该连接(我的意思是,相同的SqlConnection实例),但是如果您需要在从SqlDataReader读取时访问数据库,那么您将需要两个不同的连接


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

如果您说“不要使用MARS”-您有什么具体原因吗?出于好奇。。。讨论了使用MARS的一些负面影响MARS的事务隔离模型是不完整的,如在理论上没有完全定义。正如Richard发布的链接所承认的,结果是服务器可能会“混乱”。这种“混乱”通常意味着可能的交互数量太多,并且服务器中的所有代码路径都没有经过测试和验证。再加上这个错误是如何发生的:您可以显式地在SqlDataReader循环中调用一个新批执行(不太可能,因为您以前已经看到过这种情况)或者跳过SqlDataReader.Close调用,可能是由于异常(可能与安全性更改有关)。始终将SqlDataReader包装在using语句中,以在出现异常时强制其关闭。