c# - SqlDataAdapter vs SqlDataReader




.net (3)

Quais são as diferenças entre usar SqlDataAdapter vs SqlDataReader para obter dados de um banco de dados?

Eu estou olhando especificamente em seus prós e contras, bem como suas performances de velocidade e memória.

obrigado


SqlDataReader:

  • Mantém a conexão aberta até você terminar (não esqueça de fechá-la!).
  • Normalmente, só pode ser iterado mais de uma vez
  • Não é tão útil para atualizar de volta para o banco de dados

Por outro lado, isso:

  • Só tem um registro na memória de cada vez, em vez de um conjunto completo de resultados (isso pode ser enorme)
  • É o mais rápido possível para essa iteração
  • Permite que você inicie o processamento dos resultados mais rapidamente (uma vez que o primeiro registro esteja disponível)

SqlDataAdapter / DataSet

  • Permite fechar a conexão assim que é feito o carregamento de dados, e pode até mesmo fechar para você automaticamente
  • Todos os resultados estão disponíveis na memória
  • Você pode iterar sobre ele quantas vezes precisar, ou até procurar um registro específico por índice
  • Tem algumas faculdades internas para atualizar de volta para o banco de dados

Ao custo de:

  • Muito maior uso de memória
  • Você espera até que todos os dados sejam carregados antes de usar qualquer um deles

Então, realmente depende do que você está fazendo, mas eu prefiro um DataReader até precisar de algo que só é suportado por um dataset. O SqlDataReader é perfeito para o caso comum de acesso a dados de ligação a uma grade somente leitura.

Para mais informações, consulte a documentação oficial da Microsoft .


A resposta para isso pode ser bem ampla.

Essencialmente, a principal diferença para mim que geralmente influencia minhas decisões sobre qual usar é que, com um SQLDataReader, você está "transmitindo" dados do banco de dados. Com um SQLDataAdapter, você está extraindo os dados do banco de dados para um objeto que pode ser consultado mais a fundo, além de executar operações CRUD.

Obviamente, com um fluxo de dados SQLDataReader é MUITO mais rápido, mas você só pode processar um registro de cada vez. Com um SQLDataAdapter, você tem uma coleção completa das linhas correspondentes à sua consulta do banco de dados para trabalhar com / passar pelo seu código.

AVISO: Se você estiver usando um SQLDataReader, SEMPRE, SEMPRE, SEMPRE certifique-se de escrever o código adequado para fechar a conexão, pois você mantém a conexão aberta com o SQLDataReader. Se isso não for feito, ou se o tratamento de erros for adequado para fechar a conexão, no caso de um erro no processamento dos resultados, o aplicativo será criptografado com vazamentos de conexão.

Perdoe meu VB, mas esta é a quantidade mínima de código que você deve ter ao usar um SqlDataReader:

Using cn As New SqlConnection("..."), _
      cmd As New SqlCommand("...", cn)

    cn.Open()
    Using rdr As SqlDataReader = cmd.ExecuteReader()
        While rdr.Read()
            ''# ...
        End While
    End Using
End Using     

C # equivalente:

using (var cn = new SqlConnection("..."))
using (var cmd = new SqlCommand("..."))
{
    cn.Open();
    using(var rdr = cmd.ExecuteReader())
    {
        while(rdr.Read())
        {
            //...
        }
    }
}

Use um SqlDataAdapter ao querer preencher um DataSet / DataTable na memória do banco de dados. Você então tem a flexibilidade de fechar / descartar a conexão, passar o datatable / set pela memória. Você poderia, então, manipular os dados e persistir de volta no banco de dados usando o adaptador de dados, em conjunto com InsertCommand / UpdateCommand.

Use um SqlDataReader ao desejar acesso rápido e com pouca memória ao tamanho da memória sem a necessidade de flexibilidade para, por exemplo, passar os dados em torno de sua lógica de negócios. Isso é mais ideal para recuperação rápida e com pouca memória de grandes volumes de dados, pois não carrega todos os dados na memória de uma só vez - com a abordagem SqlDataAdapter, o DataSet / DataTable seria preenchido com todos os dados, portanto, se há um monte de linhas e colunas, que exigirão muita memória para manter.





.net