1

完了したら閉じる必要があるデータベース リンクを使用するコードがいくつかあります。電話をかけDBMS_SESSION.Close_database_linkましたが、リンクが使用されていないにもかかわらず、エラー ORA-02080 が表示されます。

SQL*Plus で試してみたところ、問題なく動作し、実行後に終了しましたCOMMIT。しかし、.Net では、commit を実行しても閉じません。

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();
}
4

1 に答える 1

1

@Lukeのおかげで、私は途中で解決策を見つけました。

デフォルトでは、Oracle はカーソルをキャッシュして開いたままにしているようです。また、カーソルが開いている場合は、データベース リンクを閉じることができません。

カーソル キャッシュを制御する接続文字列のフラグは次のとおりです。

Statement Cache Size

OracleConnection クラスPurgeStatementCacheのキャッシュ メソッドを呼び出して、キャッシュを手動でクリアできます。

于 2012-06-10T14:25:44.890 に答える