2011-11-12 2 views
2

Я пытаюсь прочитать базу данных MySQL из моего проекта C# с использованием драйверов MySQL для .net с сайта MySQL.Получение исключения: Неверная попытка прочитать, когда читатель закрыт

Хотя я немного поработал над этим (включая this), я все еще смущен, почему это происходит. Позже я получил всплеск, и я все равно получаю ту же ошибку. (До запуска этого я заполнил базу данных с некоторыми значениями по умолчанию.) Вот код всплеска в toto.

class Program { 
    static void Main (string[] args) { 
     Console.WriteLine (GetUserAge ("john")); // o/p's -1 
    } 

    static int GetUserAge (string username) { 
     string sql = "select age from users where [email protected]"; 

     int val = -1; 
     try { 
      using (MySqlConnection cnn = GetConnectionForReading()) { 
       cnn.Open(); 
       MySqlCommand myCommand = new MySqlCommand (sql, cnn); 
       myCommand.Parameters.AddWithValue ("@username", username); 

       using (MySqlDataReader reader = myCommand.ExecuteReader()) { 
        DataTable dt = new DataTable(); 
        dt.Load (reader); 

        if (reader.Read()) { 
         val = reader.GetInt32 (0); 
        } 
       } 
      } 
     } catch (Exception ex) { 
      Console.WriteLine (ex.Message); 
     } finally { 
     } 

     return val; 
    } 

    private static MySqlConnection GetConnectionForReading() { 
     string conStr = "Data Source=localhost;Database=MyTestDB;User ID=testuser;Password=password"; 
     return new MySqlConnection (conStr); 
    } 
} 

Приведенный выше код дает мне исключение: «Неверная попытка чтения, когда читатель закрыт».

Позже я изменил, если-условие так:

if (reader.HasRows && reader.Read()) { 
    val = reader.GetInt32 (0); 
} 

А теперь о/р -1. (Данные находятся там в таблице.) Если по какой-то причине результирующий набор имел нулевые строки, читатель не должен был попадать в if-блок в первую очередь. Я имею в виду, что цель метода Read() - проверить, есть ли в результирующем наборе какие-либо строки.

В конце моего ума здесь ... просто не могу понять, куда я иду.

Благодарим за помощь! :)

+0

@harpo: вы должны сделать этот комментарий ответом – BrokenGlass

+0

@BrokenGlass, ладно, просто использовал этикет для не-top-of-my-head :) – harpo

+0

Такая же ошибка в другом сценарии http: // stackoverflow. com/questions/6775136/invalid-try-to-call-read-when-reader-is-closed-error-for-lengthy-operatio – Lijo

ответ

3

Я думаю, что использование DataTable.Load будет «потреблять» читателя и, по крайней мере, позиционирует его в конце. Это может даже объяснить закрытую связь (но я просто догадываюсь здесь). Что делать, если вы удалите эту строку? Я не думаю, что это имеет смысл здесь.

+0

Иногда решение сидит прямо под вашим носом, и вам нужно кого-то подтолкнуть:) Я просто избавился от строк: DataTable dt = new DataTable(); dt.Load (читатель); это сработало. Для жизни я не могу понять, как я пропустил это! Еще раз спасибо @harpo! – Najeeb

Смежные вопросы