在.NET中关闭数据库链接,ORA-02080

时间:2012-06-10 08:45:35

标签: c# .net oracle odp.net

我有一些使用数据库链接的代码,完成后需要关闭。 我打电话给DBMS_SESSION.Close_database_link,但它给了我错误,ORA-02080,即使该链接已不再使用。

当我在SQL * Plus中尝试它时,它在我运行COMMIT之后运行良好且已关闭。但是在.Net中,即使我运行提交它也不会关闭。

using (var con = new Oracle.DataAccess.Client.OracleConnection(@"Data Source=firefly8;User Id=USER;Password=PWD;Pooling=false;"))
            {
                con.Open();
                var c = con.CreateCommand();
                c.CommandText = "select a from tnoam@link_2";
                using (var r = c.ExecuteReader())
                {
                    r.Read();
                }
                c.Dispose();

                var c2 = con.CreateCommand();
                c2.CommandText = "begin commit; dbms_session.close_database_link ('link_2');end;";

                c2.ExecuteNonQuery();
            }

我非常喜欢这个。请帮忙

根据@Ben的评论我尝试了以下内容,但它没有效果:

    using (var con = new Oracle.DataAccess.Client.OracleConnection(@"Data Source=firefly8;User Id=MILK_NEW;Password=MILK_NEW;Pooling=false;"))
{
    con.Open();
    var t = con.BeginTransaction();
    var c = con.CreateCommand();
    c.Transaction = t;
    c.CommandText = "select a from tnoam@link_2";
    using (var r = c.ExecuteReader())
    {
        r.Read();
    }
    t.Commit();
    c.Dispose();

    var c2 = con.CreateCommand();
    c2.CommandText = "begin commit; dbms_session.close_database_link ('link_2');end;";

    c2.ExecuteNonQuery();
}

1 个答案:

答案 0 :(得分:1)

感谢@Luke,我找到了解决办法。

默认情况下,Oracle会缓存游标并使其保持打开状态。如果光标处于打开状态,则无法关闭数据库链接。

控制游标缓存的连接字符串中的标志是:

Statement Cache Size

您可以通过调用OracleConnection class

PurgeStatementCache缓存方法手动清除缓存