“使用”未关闭Connection

时间:2015-07-01 07:45:35

标签: c# oracle connection bulkinsert using

这是我们用于在Oracle数据库中插入记录的代码

using (Oracle.DataAccess.Client.OracleConnection conn = 
                new Oracle.DataAccess.Client.OracleConnection(ConnectionString))
{
    conn.Open();
    using (Oracle.DataAccess.Client.OracleBulkCopy c = new 
                  Oracle.DataAccess.Client.OracleBulkCopy(conn, UseInternalTransaction)
          )
    {
        c.DestinationTableName = string.Format("{0}.{1}", Schema, Destination);
        c.WriteToServer(dtLimitStatsDetails);
        c.Close();
    }
}

运行此代码一段时间后,我们开始收到以下错误

ORA-01012: not logged on

在检查时,我们发现此ConnectionString ~2,000次会话,即会话(连接)未被关闭。

  

The connection is automatically closed at the end of the using block

看起来'using'没有关闭Connections,为什么?

1 个答案:

答案 0 :(得分:0)

using语句提供了一种方便的语法,可确保正确使用IDisposable对象。

https://msdn.microsoft.com/en-us/library/yh598w02.aspx

SqlConnection类有一个覆盖连接的覆盖方法。

protected override void Dispose(bool disposing)
{
  if (disposing)
  {
    this._userConnectionOptions = (DbConnectionOptions) null;
    this._poolGroup = (DbConnectionPoolGroup) null;
    this.Close();
  }
  this.DisposeMe(disposing);
  base.Dispose(disposing);
}

如果您使用的是自定义OracleConnection类,则必须在Dispose方法中实现IDisposable接口并关闭连接。

如果没有,请手动关闭连接并检查是否有错误。

最后一条建议,使用语句解包OracleConnection;

using (Oracle.DataAccess.Client.OracleBulkCopy c = new Oracle.DataAccess.Client.OracleBulkCopy(ConnectionString, UseInternalTransaction))
{
    c.DestinationTableName = string.Format("{0}.{1}", Schema, Destination);
    c.WriteToServer(dtLimitStatsDetails);
    c.Close();
}