SqlDataAdapter vs SqlDataReader

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

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

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 database

Por outro lado, ele:

  • Só tem um registro na memory 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 memory
  • 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 database

Ao custo de:

  • Muito maior uso de memory
  • 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 de access a dados comuns de binding a uma grade somente leitura.

A resposta para isso pode ser bem ampla.

Essencialmente, a principal diferença para mim que normalmente influencia minhas decisões sobre qual usar é que, com um SQLDataReader, você está “transmitindo” dados do database. Com um SQLDataAdapter, você está extraindo os dados do database para um object que pode ser consultado mais detalhadamente, além de executar operações CRUD.

Obviamente, com um stream 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 database para trabalhar com / passar pelo seu código.

Aviso: se você estiver usando um SQLDataReader, SEMPRE, SEMPRE, SEMPRE certifique-se de que você escreve o código adequado para fechar a conexão, pois você está mantendo a conexão aberta com o SQLDataReader. Se isso não for feito, ou se o tratamento de erros for apropriado para fechar a conexão, no caso de um erro no processamento dos resultados, a opção CRIPPLE será aplicada 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()) { //... } } } 

Um SqlDataAdapter é normalmente usado para preencher um DataSet ou DataTable e, portanto, você terá access aos dados após a conexão ter sido fechada (access desconectado).

O SqlDataReader é um cursor somente de avanço rápido e conectado que tende a ser geralmente mais rápido do que preencher um DataSet / DataTable.

Além disso, com um SqlDataReader, você lida com seus dados um registro por vez e não armazena nenhum dado na memory. Obviamente, com um DataTable ou DataSet, você tem uma sobrecarga de alocação de memory.

Se você não precisa manter seus dados na memory, apenas para renderizar coisas, vá para o SqlDataReader. Se você quiser lidar com seus dados de maneira desconectada, escolha o DataAdapter para preencher um DataSet ou DataTable.

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

Use um SqlDataReader ao desejar access rápido e com pouca memory a dados 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 memory de grandes volumes de dados, pois ele não carrega todos os dados na memory de uma só vez – com a abordagem SqlDataAdapter, o DataSet / DataTable seria preenchido com todos os dados. há um monte de linhas e colunas, que exigirão muita memory para manter.