这是我们用于在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,为什么?
答案 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();
}