2009-08-27 7 views
1

C#, .Net 2.0: J'ai une classe qui encapsule un seul enregistrement à partir d'une base de données accessible via un objet OleDbConnection. C'est assez simple, il exécute un "SELECT * FROM table WHERE key = {une certaine valeur};" puis expose les champs en tant que propriétés avec quelques méthodes pour manipuler les données. Lorsque je crée une nouvelle instance de cet objet, le code qui est exécuté ressemble:Quel est le meilleur moyen de récupérer un seul enregistrement via un OleDbConnection?

 DataSet ds = new DataSet(); 
     ds.Locale = CultureInfo.InvariantCulture; 
     OleDbDataAdapter da = new OleDbDataAdapter(cmd); 

     if (cmd.Connection.State != ConnectionState.Open) 
     { 
      cmd.Connection.Close(); 
      cmd.Connection.Open(); 
     } 

     da.Fill(ds); 

     return ds.Tables[0]; 

cmd est un objet OleDbCommand passé à la méthode. Lorsque j'exécute cela, environ 95% du temps nécessaire pour créer l'objet se trouve dans l'appel da.Fill (ds), selon le profileur VS 2008. J'ai également une classe qui représente une collection de ces objets qui implémente IEnumerable, et lors de l'itération de cet objet en utilisant foreach, chaque objet record est créé à la volée et ces instructions da.Fill (ds) s'additionnent rapidement.

Ma question est, est-ce la meilleure façon d'aller chercher un seul enregistrement? Alternativement, y a-t-il une manière plus préférée d'implémenter l'objet de collection de sorte qu'itérer ne prend pas si longtemps?

Merci

+0

Merci! J'ai essayé les solutions OleDbDataReader suggérées. Malheureusement, dans mon scénario spécifique, aucune des solutions DataReader n'a amélioré notablement les performances par rapport à l'utilisation de OleDbDataAdapter.Fill(). –

Répondre

9

Utilisez OleDbDataReader et envisagez d'utiliser CommandBehavior.SingleRow.

using (OleDbDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow)) 
{ 
    if (reader.Read()) 
    { 
     // Bind your object using the reader. 
    } 
    else 
    { 
     // No row matched the query 
    } 
} 

SingleRow fournit une indication au fournisseur OLEDB sous-jacent qui permet d'optimiser la façon dont il traite le résultat.

+0

Je suis malheureusement en train d'utiliser Jet actuellement, et CommandBehavior.SingleRow ne semble pas faire la moindre différence pour mon scénario. Déposez-la pour référence future, cependant. –

1

Vous pouvez utiliser un lecteur de données:

using (var connection = new OleDbConnection(connectionString)) 
{ 
    connection.Open(); 

    var command = new OleDbCommand(queryString, connection); 
    var reader = command.ExecuteReader(); 

    var person = new Person(); 
    if (reader.Read()) 
    { 
     person.Name = reader["Name"].ToString(); 
     person.Age = Convert.ToInt32(reader["Age"]); 
    } 

    return person; 
} 
1

Si vous attendez un seul résultat, vous pouvez utiliser ExecuteScalar

Il retourne la première colonne de la première rangée.

Questions connexes