2009-06-05 7 views

Répondre

4

Si vous regardez le code généré par le concepteur, vous verrez que s'il y a une connexion, l'adaptateur le réutilise, sinon il en crée un nouveau. Lors de l'exécution d'une méthode de requête, si la connexion n'est pas ouverte, la méthode l'ouvre. Si la méthode l'ouvre, elle le ferme quand c'est fait. Par défaut, vous obtenez une nouvelle connexion pour chaque adaptateur de table.

+0

Pourrait-il réutiliser une connexion via la mise en pool de connexions si, dans un certain délai? –

+0

Ceci est orthogonal à la façon dont le gestionnaire de connexions gère le regroupement de connexions. Comme il utilise à chaque fois la même chaîne de connexion (à moins que vous ne fassiez quelque chose de différent), ils seront tirés du même pool. Le simple fait qu'il s'agisse d'un adaptateur de table ne change pas la façon dont les pools sont gérés. Si vous êtes intéressé, il existe un article sur MSDN qui couvre le pooling, mais il n'est pas spécifique aux adaptateurs de table (il ne l'est pas non plus): http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx – tvanfosson

+0

Merci pour le lien. –

0

oui, TableAdapter est de laisser la connexion ouverte si vous l'avez ouvert avant et passer à l'adaptateur et l'adaptateur ouvert et Closa si vous passez connexion fermée, ou laisser le conenction par défaut

0

Vous pouvez faire comme ceci:

using (var MyConnection = new SqlConnection("Connection String Here")) 
{ 
    var MyDataAdapter = new SqlDataAdapter("Select * from [stuff]", MyConnection); 
    MyDataAdapter.Fill(MyDataSet); 
} 

ou

using (var MyConnection = new SqlConnection("Connection String Here")) 
{ 
    var MyDataAdapter = new SqlDataAdapter(); 
    var SelectCommand = MyConnection.CreateCommand(); 
    SelectCommand.CommandText = "select * from [stuff]"; 
    MyDataAdapter.SelectCommand = SelectCommand; 
    MyDataAdapter.Fill(MyDataSet); 
} 

Quant à la durée de vie de la connexion, si elle n'est pas ouverte, elle s'ouvrira et se fermera pour vous.

+0

Je pense qu'il parle d'adaptateurs de table générés par le concepteur, pas de SqlDataAdapters. – tvanfosson

+0

Bah, je n'ai pas compris cela de la question, mais par la réponse choisie il semble que tu as raison. – JasonRShaver

1

Voici le code d'un designer généré typique fonction de table Adaptateur:

Selon MSDN, DbDataAdapter.Fill se comportent comme ceci:

La méthode de remplissage récupère les lignes de la source de données à l'aide l'instruction SELECT spécifiée par une propriété SelectCommand associée. L'objet de connexion associé à l'instruction SELECT doit être valide, mais il n'a pas besoin d'être ouvert. Si la connexion est fermée avant l'appel de Fill, il est ouvert pour récupérer les données, puis fermé. Si la connexion est ouverte avant l'appel de Fill, il reste ouvert.

Ref: Fill Method (DataTable)

Cependant, dans une Insérer/Supprimer/Mise à jour concepteur généré, le code ressemblerait à ceci:

global::System.Data.ConnectionState previousConnectionState = this.Adapter.InsertCommand.Connection.State; 
     if (((this.Adapter.InsertCommand.Connection.State & global::System.Data.ConnectionState.Open) 
        != global::System.Data.ConnectionState.Open)) { 
      this.Adapter.InsertCommand.Connection.Open(); 
     } 
     try { 
      int returnValue = this.Adapter.InsertCommand.ExecuteNonQuery(); 
      return returnValue; 
     } 
     finally { 
      if ((previousConnectionState == global::System.Data.ConnectionState.Closed)) { 
       this.Adapter.InsertCommand.Connection.Close(); 
      } 
     } 
0

Qu'est-ce qui se passe quand

Dim Dt As dataset1.UsersDataTable 
With New dataset1TableAdapters.UsersTableAdapter 
    Dt = .GetData() 
End With 

La connexion est-elle restée ouverte? ou fermé?

Questions connexes