2010-02-28 20 views
2

juste trébuché à travers la nouvelle variable ClientId (alias client_identifier) ​​qui est disponible dans Oracle 10g partir, et je serais ravi d'incorporer cela dans une application pour aider à des pistes de vérification.Comment puis-je utiliser la propriété ClientId d'Oracle avec Enterprise Library?

L'application utilise une couche à base générée Enterprise Library DAAB (de netTiers) qui est câblé à utiliser les pilotes ODP.Net avec EntLibContrib, donc les fonctions de CRUD créer un objet OracleDatabase puis récupérer des objets dbcommand génériques de ce

il ressemble à la classe OracleConnection a la propriété ClientId, alors quelle est la façon la plus propre pour se rendre à l'objet de connexion dans ce modèle? Dois-je saisir la connexion de chaque DbCommand que je crée et la placer là, ou est-ce exagéré?

Parce que EntLib fait une grande partie de la gestion de la connexion dans les coulisses, je ne sais pas si je peux régler la ClientId quelque part en dehors des fonctions CRUD et attends de persister?

+0

Je ne vois aucune raison pour laquelle vous ne pouvez pas saisir la connexion et mettre à jour la propriété de l'objet ClientId DbCommand. Bien qu'il n'existe pas quelque part où vous pouvez accéder directement à l'objet DbConnection? À moins que les choses ne EntLib avec le ClientId (ce dont je doute), il persistera pendant le reste de votre session de connexion. – mservidio

Répondre

0

Si la connexion est une classe partielle, vous pouvez mettre en œuvre un déclencheur qui définit l'identifiant client chaque fois que la connexion change d'état pour ouvrir. C'est ainsi que je l'ai implémenté.

Je ne sais pas si vous pouvez utiliser une partie de celle-ci:

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