Respostas:
Por outro lado, ele:
À custa de:
Realmente depende do que você está fazendo, mas eu prefiro um DataReader até precisar de algo que seja suportado apenas por um conjunto de dados. 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 .
while (reader.Read())
loop.
A resposta para isso pode ser bastante ampla.
Essencialmente, a principal diferença para mim, que geralmente influencia minhas decisões sobre a 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 em um objeto que pode ser consultado ainda mais, além de executar operações CRUD.
Obviamente, com um fluxo de dados, o SQLDataReader é MUITO mais rápido, mas você pode processar apenas um registro por vez. Com um SQLDataAdapter, você tem uma coleção completa das linhas correspondentes à sua consulta no banco de dados para trabalhar com / passar 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 está mantendo a conexão aberta com o SQLDataReader. A falha em fazer isso ou o tratamento adequado de erros para fechar a conexão em caso de erro no processamento dos resultados CRIPPLE seu aplicativo 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 geralmente é usado para preencher um DataSet ou DataTable e, portanto, você terá acesso aos dados após o fechamento da conexão (acesso desconectado).
O SqlDataReader é um cursor conectado somente para encaminhamento e rápido, 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 memória. Obviamente, com um DataTable ou DataSet, você tem uma sobrecarga de alocação de memória.
Se você não precisar manter seus dados na memória, apenas para renderizar itens, vá para o SqlDataReader. Se você deseja lidar com seus dados de maneira desconectada, escolha o DataAdapter para preencher um DataSet ou DataTable.
Use um SqlDataAdapter ao desejar preencher um DataSet / DataTable na memória do banco de dados. Você tem a flexibilidade de fechar / descartar a conexão, passar a tabela / conjunto de dados na memória. Em seguida, você pode manipular os dados e persistir no banco de dados usando o adaptador de dados, em conjunto com InsertCommand / UpdateCommand.
Use um SqlDataReader ao desejar um acesso rápido aos dados de área de ocupação reduzida, sem a necessidade de flexibilidade, por exemplo, para passar os dados pela lógica de negócios. Isso é mais ideal para a 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. há muitas linhas e colunas, que exigirão muita memória para manter.
A função Fill usa um DataReader internamente. Se sua consideração for "Qual é mais eficiente?", O uso de um DataReader em um loop restrito que preenche uma coleção registro por registro provavelmente terá a mesma carga no sistema que o DataAdapter.Fill.
(System.Data.dll, System.Data.Common.DbDataAdapter, FillInternal.)