Отобразить таблицу MySQL в ярлыке на C#

#c# #mysql #sql #stringbuilder #dataview

#c# #mysql #sql #stringbuilder #просмотр данных

Вопрос:

Я пытаюсь реализовать приложение, объединенное с базой данных mysql. Я хочу показать table1 как в представлении терминала, вместо того, чтобы отображать ее в представлении datagrid. Я использую приведенный ниже код для подключения и отображения из базы данных MySQL:

 string myConnection = "datasource=localhost;port=3306;username=root;password=";
MySqlConnection myConn = new MySqlConnection(myConnection);
MySqlCommand command = myConn.CreateCommand();
command.CommandText = "Select * FROM database_name.table1";
MySqlDataReader myReader;

        try
        {
            myConn.Open();
            myReader = command.ExecuteReader();

            while (myReader.Read())
            {
                label1.Text = myReader[0].ToString();

            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        myConn.Close();
  

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

Любая помощь по этому вопросу была бы отличной.

Заранее благодарю!

Комментарии:

1. Я не уверен, что это хорошая идея. Вы пробовали подобное label1.Text = для конкатенации строк.

2. ваш код получает все данные, но они заменяются следующими данными. таким образом, вы можете видеть только последнее значение.

3. Я бы предложил использовать метод StringBuilder and it’s AppendFormat для построения выходных данных, затем вызвать его ToString метод в конце и задать Text из Label только один раз. Если вы используете шрифт фиксированной ширины, то вы можете отобразить данные в «столбцах», используя соответствующее форматирование: vbforums.com /…

Ответ №1:

Я думаю, MySqlDataReader.FieldCount Property это будет полезно.

Попробуйте этот код:

 string myConnection = "datasource=localhost;port=3306;username=root;password=";
MySqlConnection myConn = new MySqlConnection(myConnection);
MySqlCommand command = myConn.CreateCommand();
command.CommandText = "Select * FROM database_name.table1";
MySqlDataReader myReader;

    try
    {
        myConn.Open();
        myReader = command.ExecuteReader();

        while (myReader.Read())
        {
            if(label1.Text.Length > 0)
                 label1.Text  = Environment.NewLine;

            for(int i=0; i<myReader.FieldCount; i  )
                label1.Text  = myReader[i].ToString()   "    ";
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    myConn.Close();
  

ПРИМЕЧАНИЕ: Рекомендуется использовать using инструкцию для mysqlconnection , mysqldatareader и mysqlcommand .

ОБНОВИТЬ (используя StringBuilder в соответствии с рекомендациями jmcilhinney):

 // Method used to retrieve data from DB
string GetFormattedText()
{
    string myConnection = "datasource=localhost;port=3306;username=root;password=";            

    using (MySqlConnection myConn = new MySqlConnection(myConnection))
    {
        myConn.Open();

        using (MySqlCommand command = myConn.CreateCommand())
        {
            command.CommandText = "Select * FROM database_name.table1";

            using (MySqlDataReader myReader = command.ExecuteReader())
            {
               try
               {
                   StringBuilder sb = new StringBuilder();

                   while (myReader.Read())
                   {
                       if (sb.Length > 0)
                           sb.Append(Environment.NewLine);

                        for (int i = 0; i < myReader.FieldCount; i  )
                           sb.AppendFormat("{0}    ", myReader[i]);                               
                    }

                    return sb.ToString();
               }
               catch (Exception ex)
               {
                    MessageBox.Show(ex.Message);
               }
            }
        }
    }

    return string.Empty;
}
  

Использование:

  label1.Text = GetFormattedText();
  

Комментарии:

1. Спасибо! Это работает нормально. Есть еще одна вещь, которую я хочу добавить. Как я могу синхронизировать таблицу базы данных. Я не могу использовать таймер, потому что он будет показывать все данные снова и снова вместо получения только обновленных данных. есть ли какое-либо решение для этого?

2. Добро пожаловать. Для синхронизации вам нужно снова вызвать этот метод, но перед загрузкой данных в label1 вы должны сделать его пустым. Просто добавьте строку label1.Text = string.Empty; перед while-loop .

3. Не рекомендуется изменять элементы управления снова и снова подобным образом или продолжать создавать и выбрасывать String объекты. Лучше создавать таблицу StringBuilder по мере чтения данных, затем создать ее String и обновить элемент управления один раз в конце.

4. @HassanNisar Я не думаю, что это будет хорошей идеей. Потому что, когда база данных становится больше, приложение получает больше времени отклика для получения большого объема данных.

5. джим чилхинни сказал это правильно. Использование StringBuilder вполне уместно. Но @UserPhalcon, я не думаю, что будет эффективно обновлять часть label1. Текст в зависимости от значений, измененных в базе данных.