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