Как использовать свойство Oracle ClientId с Enterprise Library? - PullRequest
2 голосов
/ 28 февраля 2010

Просто наткнулся на новую переменную ClientId (она же client_identifier), которая доступна в Oracle 10g и далее, и хотел бы включить ее в приложение, чтобы помочь с журналами аудита.

Приложение использует созданный слой на основе DAAB Enterprise Library (netTiers), который подключен для использования драйверов ODP.NET с EntLibContrib, поэтому функции CRUD создают объект OracleDatabase, а затем извлекают из него универсальные объекты DbCommand

Похоже, что класс OracleConnection имеет свойство ClientId, так каков самый чистый способ добраться до объекта Connection в этом шаблоне? Должен ли я извлекать соединение из каждой создаваемой мной DbCommand и устанавливать его там, или это перебор?

Поскольку EntLib выполняет большую часть управления подключениями за кулисами, я не уверен, смогу ли я установить ClientId где-то за пределами функций CRUD и ожидать, что он сохранится?

1 Ответ

0 голосов
/ 08 ноября 2011

Если соединение является частичным классом, вы можете реализовать триггер, который устанавливает идентификатор клиента всякий раз, когда соединение меняет состояние на открытое. Вот как я это реализовал.

Я не знаю, можете ли вы использовать часть этого:

public partial class DataContext
{
    partial void OnContextCreated()
    {
        if ( null == this.Connection ) return;

        this.Connection.StateChange += Connection_StateChange;
    }
    private EntityConnection EntityConnection
    {
        get { return this.Connection as EntityConnection; }
    }
    private OracleConnection OracleConnection
    {
        get { return this.EntityConnection.StoreConnection as OracleConnection; }
    } 
    private void Connection_StateChange( object sender, StateChangeEventArgs e )
    {
        if ( e.CurrentState != ConnectionState.Open ) return;

        OracleConnection conn = this.OracleConnection;
        if ( null == conn ) return;

        //closes connection on DataContext (bug?), and passes closed/broken connection 
        //conn.ClientId = HttpContext.Current == null ? "Anonymous" : HttpContext.Current.Profile.UserName;

        //working solution
        string identity = HttpContext.Current == null ? "Anonymous" : HttpContext.Current.Profile.UserName;
        OracleCommand cmd = conn.CreateCommand();
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "DBMS_SESSION.SET_IDENTIFIER";
        cmd.Parameters.Add( new OracleParameter { ParameterName = "client_id", Value = identity } );
        cmd.ExecuteNonQuery();
        cmd.Dispose();

        return;
    }

    protected override void Dispose( bool disposing )
    {
        if ( null != this.Connection )
            this.Connection.StateChange -= Connection_StateChange;

        base.Dispose( disposing );
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...