可以返回的声明防止使用声明,关闭一个数据库的连接?
-
09-09-2019 - |
题
当我创造的临时表格,我得到一个错误信息,告诉我,临时表已经存在。临时表格是唯一的话看起来是这样的我连接不关闭正常,我觉得它可能有一些与返回的发言中,我有我的用词。
我有下列代码:
using (IDbConnection connection = dbConnectionHandler.CreateConnection())
{
connection.Open();
CreateATempTable();
PopulateTempTable();
DataSet ds = CallStoredProcThatUsesTempTable();
return ds;
}
我利用这种代码在几个地方创建一个临时表有相同的名称。
不幸的是,我越来越以下错误: There is already an object named '#MyTempTable' in the database
.
现在,我知道,临时表格是唯一的话和这样一次会议是封闭的,它应该消失。
有三件事情,我相信可能会导致这个...
- 我需要呼叫连接。Close()
- 我需要的地方返回的声明外面我使用的声明
- 我需要降临时表我之前创建的返回
任何人都不会知道它是哪一个?或者,如果它的东西我没想到的?
解决方案
我猜在这里,但检查你的连接数据库集中设置。试试转动池关闭,看看是否有帮助。
通常,当你接近/处置的连接。净库的水平,真正的数据库服务器的连接不是封闭的。这是刚刚返回池连接的内部数据提供者和将重复使用当程序要求的另一个连接具有相同参数和全权证书。我不认为数据库届会议复位在任何方式之前返回到游泳池,除了开放式的交易以及或许一些基本参数。更昂贵的对象样的临时表格,被单独留在家中。
你可以把汇集关(非常低效率).或者你可以检查临时表之前存在试图创建它,并删除其内容,如果它的存在。或者你可以降临时表在关闭之前的连接。
其他提示
我相当肯定,连接。Dispose()(以及由此连接。Close()as well)将称为。
你可以验证足够容易地通过执1)和2)和检查的问题仍然存在。该解决方案可能是3)和说明将连接池。
除非一个权力循环发生或其他一些认真的奇怪角落的情况下处置将被称为。
如果你想要证据包的目的而把一个断点。
一个使用框翻译成一种尝试/赶/finally引擎盖下。是的,它会弃置不管的返回内使用区块。
没有,连接。靠近总是会被称为因为在内部 使用 把它放在一个试用/最终区块。
你也可能想要考虑连接池。尽量包装你的代码TransactionScope.
来回答你的问题:
- 所使用的发言将隐含地关闭连接、连接时的处置方法。
- 不应该需要: http://aspadvice.com/blogs/name/archive/2008/05/22/Return-Within-a-C_2300_-Using-Statement.aspx
- 尝试。
使用的发言将处置的对象,如果其类IDisposable甚至没有一个返回的声明,在采用区块。
它是连接池,让你#应升级授权表,使之时,你可能会想要放弃这表。
不知道更多有关的数据库连接图书馆在使用中,我猜它既不是第一二; using
介绍了具体地来做清理这些资源更容易返回时的方法;这是直接类似于一个普通的 try...finally
框在Java或类似。
换句话说, return
将离开块和 Dispose
方法将被称作上的连接,这应该假定一个理智的执行情况,呼叫的 Close
方法作为这一进程的一部分。
这里的关键点是"理智的执行"。
它正在造成的连接池。包装你正在做什么,在交易,并把它卷回来时结束。或者,降的临时表之后填充ds。