2010-11-26 9 views
2

Je crée une application avec C# et j'ai décidé d'utiliser la bibliothèque d'entreprise pour le DAL (SQL Server). Je ne me souviens pas où, mais j'avais lu un article sur EntLib qui disait que les connexions sont fermées automatiquement.Bibliothèque d'entreprise gérer les connexions

Est-ce vrai? Si ce n'est pas le cas, quelle est la meilleure approche pour gérer les connexions dans la couche intermédiaire? Ouvrir et fermer dans chaque méthode?

Ce qui précède est une méthode d'échantillonnage de la façon dont je me sers du EntLib

public DataSet ReturnSomething 
{ 
    var sqlStr = "select something"; 
    DbCommand cmd = db.GetSqlStringCommand(sqlStr); 
    db.AddInParameter(cmd, "@param1", SqlDbType.BigInt, hotelID); 
    db.AddInParameter(cmd, "@param2", SqlDbType.NVarChar, date); 
    return db.ExecuteDataSet(cmd); 

}

Merci à l'avance.

Répondre

2

La méthode ExecuteDataSet renvoie un objet DataSet qui contient toutes les données. Cela vous donne votre propre copie locale. L'appel à ExecuteDataSet ouvre une connexion, renseigne un DataSet et ferme la connexion avant de retourner le résultat

pour plus d'informations:

http://msdn.microsoft.com/en-us/library/ff648933.aspx

+0

Que se passe-t-il si je veux obtenir un DataReader ou Insérer, supprimer, mettre à jour? Comment la connexion sera-t-elle gérée? – StrouMfios

0

Je pense que vous devriez avoir quelque chose comme une classe statique utilisée comme Façade qui fournirait la connexion correcte pour vos sous-systèmes de bibliothèque.

public static class SystemFacade { 
    // Used as a subsystem to which the connections are provided. 
    private static readonly SystemFactory _systemFactory = new SystemFactory(); 

    public static IList<Customer> GetCustomers() { 
     using (var connection = OpenConnection(nameOfEntLibNamedConnection)) 
      return _systemFactory.GetCustomers(connection); 
    } 

    public static DbConnection OpenConnection(string connectionName) { 
     var connection = 
      // Read EntLib config and create a new connection here, and assure 
      // it is opened before you return it. 

     if (connection.State == ConnectionState.Closed) 
      connection.Open(); 

     return connection;    
    } 
} 

internal class SystemFactory { 
    internal IList<Customer> GetCustomers(DbConnection connection) { 
     // Place code to get customers here. 
    } 
} 

Et en utilisant ce code:

public class MyPageClass { 
    private void DisplayCustomers() { 
     GridView.DataSource = SystemFacade.GetCustomers(); 
    } 
} 

Dans cet exemple de code, vous avez une classe statique qui fournit les fonctionnalités et les caractéristiques d'une bibliothèque de classes. La classe Façade est utilisée pour fournir à l'utilisateur toutes les actions possibles, mais vous ne voulez pas avoir un mal de tête avec la connexion à utiliser, etc. Tout ce que vous voulez, c'est la liste des clients hors du magasin de données sous-jacent. Ensuite, un appel au GetCustomers le fera.

Façade est une classe «intelligente» qui sait d'où obtenir l'information, donc crée la connexion en conséquence et commande les clients de l'usine du sous-système. L'usine fait ce qui est demandé, prend la connexion disponible et récupère les clients sans poser d'autres questions.

Est-ce que cela aide?

+0

Donc l'article que j'avais lu était faux et je dois fermer et ouvrir la connexion pour chaque utilisation! Merci pour votre aide Will Marcouiller – StrouMfios

+0

Non, vous n'avez pas besoin de gérer manuellement les connexions - le bloc ouvrira et fermera automatiquement les connexions pour vous. Cette solution est excessive, surtout si vous utilisez des ensembles de données. –

0

Oui, EntLib ferme les connexions pour vous (en fait, il les libère dans le pool de connexions). C'est la principale raison pour laquelle nous avons commencé à utiliser EntLib.

Cependant, pour tout nouveau développement, nous avons maintenant utilisé Entity Framework, nous trouvons cela beaucoup plus productif.

+0

Toute cette transparence m'inquiète. Donc, je n'ai pas besoin d'ouvrir la connexion ni de la fermer.Lorsque j'effectue une nouvelle "action", il obtient la connexion disponible de la mise en pool (si disponible) ou ouvre une nouvelle connexion? J'exécute sp_who2 dans la base de données et il y a plus de 15 connexions avec le statut de sommeil. Je suis le seul utilisateur qui utilise ce db, donc je pense que le nombre de connexion disponible est trop élevé. – StrouMfios

+0

Oui tout est automatique, essayez de mettre votre code dans une boucle et exécutez-le 1000 fois. Le nombre de connexions ne doit pas augmenter. –

+0

c'est bizarre, quelque chose ne va pas parce que je l'ai dit avant j'avais plus de 15 connexions. Il semble qu'il ne ferme pas les connexions et à chaque demande crée un nouveau. – StrouMfios

Questions connexes