Minha pergunta é como obter o número de linhas retornadas por uma consulta SqlDataReader
em C #. Já vi algumas respostas sobre isso, mas nenhuma foi claramente definida, exceto uma que afirma fazer um loop while com o Read()
método e incrementar um contador.
Meu problema é que estou tentando preencher uma matriz multidimensional com a primeira linha sendo os nomes dos cabeçalhos das colunas e cada linha depois disso sendo os dados da linha.
Sei que posso simplesmente despejar as coisas em um controle List e não me preocupar com isso, mas para minha própria edificação pessoal e também gostaria de inserir e retirar os dados do array conforme eu escolho e exibi-lo em diferentes formatos.
Então eu acho que não posso fazer o modo Read()
e incrementar ++ porque isso significa que eu teria que abrir Read()
e abrir Read()
novamente para obter a quantidade de linhas e depois os dados da coluna.
Apenas um pequeno exemplo do que estou falando:
int counter = 0;
while (sqlRead.Read())
{
//get rows
counter++
}
e um loop for para percorrer as colunas e estourar
something.Read();
int dbFields = sqlRead.FieldCount;
for (int i = 0; i < dbFields; i++)
{
// do stuff to array
}
fonte
RepeatableRead
nível de isolamento não executa bloqueio de intervalo, portanto, ainda permite que os registros sejam inseridos; você precisa estar usando um nível de isolamento deSnapshot
ouSerializable
.Se você não precisa recuperar todas as linhas e deseja evitar fazer uma consulta dupla, provavelmente pode tentar algo assim:
Você pode ter que adicionar uma transação sem ter certeza se a reutilização do mesmo comando adicionará automaticamente uma transação nele ...
fonte
sqlCon.Close();
? Achei que issousing
deveria bastar para você.Conforme acima, um conjunto de dados ou conjunto de dados tipado pode ser uma boa estrutura temorária que você pode usar para fazer sua filtragem. Um SqlDataReader serve para ler os dados muito rapidamente. Enquanto você está no loop while (), você ainda está conectado ao banco de dados e ele está esperando que você faça o que estiver fazendo para ler / processar o próximo resultado antes de prosseguir. Nesse caso, você pode obter um melhor desempenho se extrair todos os dados, fechar a conexão com o banco de dados e processar os resultados "offline".
As pessoas parecem odiar conjuntos de dados, então o que foi dito acima também poderia ser feito com uma coleção de objetos fortemente tipados.
fonte
Você não pode obter uma contagem de linhas diretamente de um leitor de dados porque é o que é conhecido como cursor firehose - o que significa que os dados são lidos linha por linha com base na leitura realizada. Eu não aconselho fazer 2 leituras nos dados porque existe a possibilidade de que os dados tenham mudado entre as duas leituras e, portanto, você obteria resultados diferentes.
O que você pode fazer é ler os dados em uma estrutura temporária e usá-la no lugar da segunda leitura. Como alternativa, você precisará alterar o mecanismo pelo qual você recupera os dados e usar algo como uma DataTable.
fonte
para completar a resposta do Pit e para um melhor desempenho: obtenha tudo em uma consulta e use o método NextResult.
fonte
Também enfrento uma situação em que preciso retornar um resultado superior, mas também quero obter o total de linhas que correspondam à consulta. Finalmente chego a esta solução:
fonte