Quelle est la meilleure façon de récupérer un seul enregistrement via un OleDbConnection?

voix
1

C #, .Net 2.0: J'ai une classe qui enveloppe un seul enregistrement à partir d'une base de données accessible par un objet OleDbConnection. Il est assez simple, il exécute un SELECT * FROM table WHERE key = {une valeur}; et expose ensuite les champs comme des 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:

        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 transmis à la méthode. Quand j'exécute cela, environ 95% du temps qu'il faut pour créer l'objet est dans la da.Fill (ds) appel, selon le profileur VS 2008.

J'ai aussi une classe qui représente une collection de ces objets qui implémente IEnumerable, et quand itérer cet objet en utilisant foreach, chaque objet d'enregistrement unique est créé à la volée et les da.Fill (ds) déclarations ajouter rapidement.

Ma question est, est-ce la meilleure façon de récupérer un seul enregistrement? Sinon, est-il un moyen plus préféré pour mettre en œuvre l'objet de collection afin itérer il ne prend pas si longtemps?

Merci

Créé 27/08/2009 à 06:24
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
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;
}
Créé 27/08/2009 à 06:39
source utilisateur

voix
1

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

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

Créé 27/08/2009 à 06:45
source utilisateur

voix
9

Utilisez OleDbDataReaderet envisager 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.

Créé 27/08/2009 à 06:53
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more