Pergunta

Estou recebendo algo muito estranho acontecendo ao tentar ler alguns dados usando o MySql .net conector. Aqui está o código:

IDataReader reader = null;

using (MySqlConnection connection = new MySqlConnection(this.ConnectionString))
{
    String getSearch = "select * from organization";
    MySqlCommand cmd = new MySqlCommand(getSearch, connection);
    cmd.CommandType = CommandType.Text;

    connection.Open();
    reader = cmd.ExecuteReader();

    while (reader.Read())
    {
        // response write some stuff to the screen (snipped for brevity)
    }
}

Se eu colocar um ponto de interrupção após o ExecuteReader e expandir os resultados ver em Visual Studio (pairando sobre leitor e expansão), eu posso ver as linhas retornadas pela consulta. Se eu então deixe que fechar e expandir os resultados ver novamente, eu recebo a mensagem 'enumeração não produziram resultados'.

Parece que o conteúdo do leitor está recebendo redefinido assim que eles são vistos.

Quanto ao que nós tentamos:
- o SQL funciona muito bem directamente para DB
- Encadernação os resultados da consulta diretamente a um datagrid apenas retorna um vazio datagrid
- tem a versão mais recente do .NET conector
- tentou em duas máquinas diferentes para descartar quaisquer erros locais

Até agora nada funcionou.

Se alguém pudesse oferecer alguma idéia ou sugestão que seria muito apreciado.

Foi útil?

Solução

do que eu entendo o SqlDataReader se destina a ser usado para uma enumeração one-time dos dados que você devolvidos. Uma vez que você ciclo através dos resultados uma vez, o objeto tem feito o seu dever. Aqui estão algumas idéias para trabalhar em torno deste, um ou outro dos quais podem resolver isso para você, dependendo de suas necessidades:

  1. -executar Re a consulta para gerar outro SqlDataReader quando necessário

  2. Em vez de usar o SqlDataReader, armazenar os resultados de sua consulta original em uma System.Data.DataTable, onde você pode, então, voltar a ler e manipular os dados como quiser.

Espero que isso ajude!

Adam

Outras dicas

Uma vez que um datareader lê em informação, o uso de bloco fecha a conexão para o leitor logo após a atribuição de seu valor para a variável. Aqui está um artigo que lhe mostra alguns exemplos de código que pode levá-lo para onde você precisa ser.

A chave é que a conexão deve ser aberto, ao tentar ler a partir do leitor.

Aqui está a explicação:

Isto porque, você já em loop através do leitor, uma vez no depurador (a primeira vez que expandiu a vista). Esta é a maneira como os leitores trabalhar, e pelo que eu sei, não há nenhuma maneira para redefinir o leitor a ir e ler novamente desde o início, com exceção da opção de re-execução:

Você só tem que executar novamente o linha cmd.ExecuteReader(); (por direito clique na fonte e usando "set próxima declaração" opção de menu).

Este é o comportamento dos leitores de dados. Se você já tiver em loop através dele, você não pode voltar atrás. Você tem que executar o comando novamente e recuperar um novo.

Se você precisa usar seus dados depois de fechar o leitor, que você pode optar por usar um Typed DataSet, ou o DataSet untyped conforme especificado no de Adam resposta .

A propósito, aqui estão algumas optimizations você poderia fazer:

  • Mova o leitor dentro do Connection usando bloco para torná-lo ir fora do escopo após o revestimento usá-lo (uma vez que você está fora do usando bloco, a ligação será fechada e você não será capaz de usá-lo de qualquer maneira, por isso não faz sentido deixá-lo fora)
  • Executar ExecuteReader em outro bloco using (como ele implementa IDisposable) e fazer a mesma coisa com o Command Sql (a mesma interface IDisposable)
  • Não recuperar todos os campos do banco de dados
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top