Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.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
C# 它对在a“外部打开DB conn有什么影响;使用;块_C#_Database_Oracle_Garbage Collection - Fatal编程技术网

C# 它对在a“外部打开DB conn有什么影响;使用;块

C# 它对在a“外部打开DB conn有什么影响;使用;块,c#,database,oracle,garbage-collection,C#,Database,Oracle,Garbage Collection,我试图在上搜索这个,但找不到。也许我没有正确搜索,这是一个复制的东西 但是我想问一个问题:在using(…)块内部和外部打开DB连接有什么区别 为了澄清我的意思,请看下面的代码片段 在“使用”块外部打开DB连接的代码段: 在“使用”块中打开DB连接的代码段: 如果出现异常,我没有在“using”中打开连接的块是否仍会将其关闭,还是保持打开状态?using语句不处理任何异常。它负责在当前对象(DB连接)上调用IDisposable。 这意味着,无论您是在using块内部还是外部打开连接,在块的末尾

我试图在上搜索这个,但找不到。也许我没有正确搜索,这是一个复制的东西

但是我想问一个问题:在using(…)块内部和外部打开DB连接有什么区别

为了澄清我的意思,请看下面的代码片段

在“使用”块外部打开DB连接的代码段:

在“使用”块中打开DB连接的代码段:


如果出现异常,我没有在“using”中打开连接的块是否仍会将其关闭,还是保持打开状态?

using语句不处理任何异常。它负责在当前对象(DB连接)上调用IDisposable。
这意味着,无论您是在using块内部还是外部打开连接,在块的末尾,连接都将被处理

因为您没有在连接对象上应用using,如果出现异常,连接将保持打开状态…因此,您需要最终关闭连接的块,即使出现异常

所以您的代码将是,因为您没有在连接对象上应用using

try
{
  using (var oraclePackage = new OraclePackage())
    {
        if (_dbConn.State != ConnectionState.Open)
            _dbConn.Open();

        // some DB functions here 
    }
}
finally
{  _dbConn.Close(); }
如果出现异常,我没有在“using”中打开连接的块是否仍会关闭它,还是保持打开状态

在这两个例子中,连接仍然是开放的,直到最终确定者运行(如果有的话)。也没有一个
using
即“using”
dbConn

守则:

using(someObject)
{
  // More code here.
}
相当于:

try
{
  // More code here.
}
finally
{
  if(someObject != null)
    ((IDisposable)someObject).Dispose();
}
var someObject = new SomeClass();
try
{
  // More code here.
}
finally
{
  if(someObject != null)
    ((IDisposable)someObject).Dispose();
}
以及守则:

using(var someObject = new SomeClass())
{
  // More code here.
}
相当于:

try
{
  // More code here.
}
finally
{
  if(someObject != null)
    ((IDisposable)someObject).Dispose();
}
var someObject = new SomeClass();
try
{
  // More code here.
}
finally
{
  if(someObject != null)
    ((IDisposable)someObject).Dispose();
}
(如果对象在任何点都无法设置为空,则可以优化空检查)

您的代码使用
oraclePackage
执行此操作,因此
oraclePackage
将保证对其调用
Dispose()
,无论代码块是否由于异常而保留。使用
dbConn
时,代码不会执行此操作

同样地,如果您没有显式地调用
dbConn.Dispose()
dbConn.Close()
(几乎肯定会调用
dbConn.Dispose()
),连接将不会关闭


如果没有剩余的GC根可以访问
dbConn
,那么最终可能会确定表示实际打开连接的内部对象,这将导致连接关闭,但这不能保证会发生或及时发生,而且它很可能不适合大多数
IDbConnection
实现使用的内部缓存机制。

可能重复@Sinatr-它看起来不像是重复的,因为这里的问题是,如果在连接对象上未应用,并且打开后在代码中引发异常,那么连接对象在哪个阶段重新生成connection@Sinatr-您链接的问题解释了using的作用。但我的问题更多的是我有一个场景,正如Pranay所说,我想知道conn对象在两个场景中将处于什么状态。链接的问题解释了
IDisposable
,我不知道oracle,但当我使用数据库(localdb,mdb)时,我会打开连接,只要我不需要,就立即查询并关闭连接。使用的模式可以完美地做到这一点。好的。即使我喜欢我的第二个代码片段中“if(_dbConn.State!=ConnectionState.Open)_dbConn.Open();”行后面的“oraclePackage.Connection=(u dbConn;);”在其
连接
被释放时是否调用
Close()
?不。那我知道它不会处理它。所以它还是开着的。是的。您希望有一些东西可以关闭它,最明显的方法是使用将
dbConn
本身放入一个
中!谢谢你,乔恩!!