Как я могу определить количество строк в базе данных, используя MySqlDataReader? - PullRequest
2 голосов
/ 16 апреля 2020

Я пытаюсь выяснить, как сделать запрос к базе данных MySql, сколько у нее строк и для каждой строки в базе данных я хочу добавить целое число в список идентификаторов. Я получаю только 1 строку, когда я запускаю этот код, когда я знаю, что у меня больше строк, чем я, я не знаю, как очень хорошо использовать DataReader, какие-либо советы о том, как я могу просто определить количество строк в базе данных будет высоко ценится.

    MySqlConnection Conn = new MySqlConnection(myConnectionString);
    MySqlDataReader mdr;
    public static List<int> AppointmentIDList = new List<int>();

    public void FillList()
    {
        Conn.Open();
        string Query = "SELECT * FROM U05lUM.appointment;";
        MySqlCommand command = new MySqlCommand(Query, Conn);
        mdr = command.ExecuteReader();
        if (mdr.Read())
        {
            if (mdr.HasRows)
            {
                foreach(int id in mdr.GetInt32("appointmentId").ToString())
                {

                    AppointmentIDList.Add(id);

                }
            }
        }
    }

Ответы [ 2 ]

2 голосов
/ 16 апреля 2020

Вы можете использовать другой запрос. Запрос может быть

MySqlCommand command = new MySqlCommand("Select Count(*) FROM U05lUM.appointment;", Conn);
Conn.Open()
int rows = Convert.ToInt32(cmd.ExecuteScalar())
Conn.Close();

. Это вернет количество строк в базе данных «U05lUM.appointment». Вы также можете использовать некоторые операторы «ГДЕ», если хотите увеличить свой счет.

2 голосов
/ 16 апреля 2020

Вы читаете только одну строку вашего набора результатов.

Вместо

if (mdr.Read())

вы должны использовать

while (mdr.Read())

Вы должны изменить SQL сказать SELECT appointmentId FROM U05lUM.appointment;. Читать все столбцы (с SELECT *) из таблицы расточительно и медленно, когда все, что вам нужно, это один столбец.

mdr.HasRows всегда будет истинным внутри блоков if (mdr.Read()) или while (mdr.Read()). Вы просто читаете строку, поэтому в наборе результатов определенно есть строки.

Ваш foreach(int id in mdr.GetInt32("appointmentId").ToString()) не делает то, что вы хотите. Он генерирует значение для каждого символа в строке, которую вы сделали из assignId.

И объект SqlDataReader с именем mdr необходимо очистить (Dispose d) после использования. Это происходит автоматически с using(){}.

Поэтому я предлагаю этот код.

    ...
    string Query = "SELECT appointmentId FROM U05lUM.appointment;";
    MySqlCommand command = new MySqlCommand(Query, Conn);
    using (SqlDataReader resultSet = command.ExecuteReader()) 
    {
        while (resultSet.Read())
        {
            int id = resultSet.GetInt32("appointmentId")
            AppointmentIDList.Add(id);
        }
    }

Это не будет быстрым, если ваша таблица большая, потому что ваш запрос должен сканировать каждую строку стол. Весь смысл SQL в том, чтобы позволить вам обрабатывать наборы данных на несколько порядков больше, чем ваша RAM. Вам следует подумать о разработке своей программы, чтобы она не считывала каждую строку без крайней необходимости.

Если все, что вам нужно, это точное количество строк, вы можете использовать COUNT(*). Это подсчитает количество строк в вашей таблице

    ...
    int rowCount;
    string Query = "SELECT COUNT(*) rowCount FROM U05lUM.appointment;";
    MySqlCommand command = new MySqlCommand(Query, Conn);
    using (SqlDataReader resultSet = command.ExecuteReader()) 
    {
        if (resultSet.Read())   // THIS result set has only one row.
        {
            rowCount = resultSet.GetInt32("rowCount")
        }
    }

Ваша СУБД умело справляется с обработкой COUNT(*). MAX(appointmentId) также может работать. Он может отличаться от количества строк, если в вашей таблице отсутствуют пропущенные значения appointmentId. Это может произойти, если некоторые строки были удалены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...