return语句是否可以阻止using语句关闭与数据库的连接?

mez*_*oid 4 c# using-statement temp-tables dbconnection

当我创建临时表时,我收到一条错误消息,告诉我临时表已经存在.临时表对于会话是唯一的,所以看起来我的连接没有正确关闭,我认为它可能与我在using语句中的return语句有关.

我有以下代码:

using (IDbConnection connection = dbConnectionHandler.CreateConnection())
{
   connection.Open();
   CreateATempTable();
   PopulateTempTable();
   DataSet ds = CallStoredProcThatUsesTempTable();
   return ds;
}
Run Code Online (Sandbox Code Playgroud)

我在几个地方使用这种代码来创建一个具有相同名称的临时表.

不幸的是,我收到以下错误:There is already an object named '#MyTempTable' in the database.

现在,我知道临时表对于会话是唯一的,因此一旦会话关闭它就会消失.

我认为有三件事可能会导致这种情况......

  1. 我需要调用connection.Close()
  2. 我需要将return语句放在using语句之外
  3. 我需要在返回之前删除我创建的临时表

有谁知道它是哪一个?或者如果它没有想到的东西?

Tom*_*icz 6

我在这里猜测,但检查您的数据库连接池设置.尝试关闭池,看看它是否有帮助.

通常,当您在.NET库级别关闭/部署连接时,不会关闭实际数据库服务器连接.它只是返回到数据提供程序内部的连接池,并在程序请求具有相同参数和凭据的另一个连接时重用.我不认为数据库会话在返回池之前以任何方式重置,除了打开的事务和可能的一些基本参数.更加昂贵的物体,如临时桌子,是独立的.

你可以关闭池(非常低效).或者,您可以在尝试创建临时表之前检查临时表的存在,并删除其内容(如果存在).或者您可以在关闭连接之前删除临时表.