Qual é a melhor maneira de buscar um único registro através de um OleDbConnection?

votos
1

C #, Net 2.0: I têm uma classe que envolve um único registo de uma base de dados acedida através de um objecto OleDbConnection. É bastante simples, ele executa um SELECT * FROM tabela WHERE chave = {algum valor}; e, em seguida, expõe os campos como propriedades, com alguns métodos para manipular os dados. Quando eu criar uma nova instância desse objeto, o código que é executado se parece com:

        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 é um objecto OleDbCommand passado para o método. Quando eu executar este, cerca de 95% do tempo que leva para criar o objeto está no (DS) chamada da.Fill, de acordo com o profiler VS 2008.

Eu também tenho uma classe que representa uma coleção desses objetos que implementa IEnumerable, e quando iteração esse objeto usando foreach, cada objeto único registro é criado na mosca e aqueles da.Fill (DS) declarações juntar-se rapidamente.

A minha pergunta é, esta é a melhor maneira de buscar um único registro? Como alternativa, há uma maneira mais preferido para implementar o objeto de coleção de modo a iteração ele não leva tanto tempo?

obrigado

Publicado 27/08/2009 em 06:24
fonte usuário
Em outras línguas...                            


3 respostas

votos
9

Use OleDbDataReadere considerar o uso 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 fornece uma dica para o provedor OLE DB subjacente que lhe permite otimizar o modo como ele processa o resultado.

Respondeu 27/08/2009 em 06:53
fonte usuário

votos
1

Se você está esperando apenas um resultado, você poderia usar ExecuteScalar

Ele retorna a primeira coluna da primeira linha.

Respondeu 27/08/2009 em 06:45
fonte usuário

votos
1

Você pode usar um leitor de dados:

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;
}
Respondeu 27/08/2009 em 06:39
fonte usuário

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