#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’sAppendFormat
для построения выходных данных, затем вызвать его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. Текст в зависимости от значений, измененных в базе данных.