Получение исключения: неверная попытка чтения, когда читатель закрыт - PullRequest
2 голосов
/ 12 ноября 2011

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

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

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 name=@username";

        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 следующим образом:

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

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

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

Спасибо за вашу помощь! :)

1 Ответ

3 голосов
/ 12 ноября 2011

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

...