Member 10696161 Ответов: 2

Как загрузить данные из SQL-запроса в datagridview?


Я объявил 2 строковые переменные:

string fname;
string lname;


Когда я писал MySQL запрос в базе данных phpMyAdmin:

SELECT workers.FNAME, workers.LNAME FROM project1.workers INNER JOIN
project1.order_status ON workers.ID_WORKER = order_status.ID_WORKER 
INNER JOIN project1.orders ON orders.ID_ORDER = order_status.ID_ORDER 
WHERE orders.ORDER_NUMBER = 'TEST' GROUP BY workers.FNAME, workers.LNAME


У меня есть 2 рабочие:

-"Адам Гакс" и
-"Андрей Червяк"

Затем я хотел бы сохранить объект из этого запроса и загрузить эти данные в datagridview:


SQLdata.connection.Open();
   using (var command = new MySqlCommand(query1, SQLdata.connection))
   {
       using (var reader1 = command.ExecuteReader())
       {
           while (reader1.Read())
           {
               fname = Convert.ToString(reader1[0]);
               lname = Convert.ToString(reader1[1]);
           }
       }
   }


Я взял точки останова в строках кода в цикле while и читаю все FNAME и LNAME. Затем он загружает все данные правильно. Затем я хочу загрузить их в datagridview.

SQLdata.connection.Close();
       sick_leaves x = new sick_leaves();
       x.FNAME = fname;
       x.LNAME = lname;
       return x;


и свяжите их вот так:

sick_leaves a = calculate_sickness_leaves(txt_NrOrder.Text);

     cu = calculate_sickness_leaves(txt_NrOrder.Text);
     var source = new BindingSource();
     source.DataSource = cu;
     dataGridView2.DataSource = source;


затем с помощью данных из файла Orders.cs:

public class sick_leaves
{
    public string FNAME { get; set; }
    public string LNAME { get; set; }
}


После компиляции его в datagridview я загрузил только 1 работника: "Andrew Worm". Это должны быть те 2 работника, чтобы он не загружал все данные из sql-запроса.

Теперь: как я могу загрузить все данные из sql-запроса в datagridview? Есть идеи?
Внимание! Мне нужна помощь в настольном приложении

Что я уже пробовал:

GenerateOrder.в CS:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using MySql.Data.MySqlClient;
using System.Windows.Forms.DataVisualization.Charting;
using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;
using System.Diagnostics;

namespace ControlDataBase
{
    public partial class GenerateChartsOfOrders : Form
    {
        string fname;
        string lname;
        sick_leaves cu = new sick_leaves();
        public GenerateChartsOfOrders()
        {
            InitializeComponent();
        }        

        public void loaddata2()
        {
            string connect = "datasource=localhost;port=3306;username=root;password=";

            MySqlConnection connection = new MySqlConnection(connect);
            connection.Open();

            sick_leaves a = calculate_sickness_leaves(txt_NrOrder.Text);

            cu = calculate_sickness_leaves(txt_NrOrder.Text);
            var source = new BindingSource();
            source.DataSource = cu;
            dataGridView2.DataSource = source;

            connection.Close();
        }

        private sick_leaves calculate_sickness_leaves(string NrOrder)
        {
            string query1 = string.Format("SELECT workers.FNAME, workers.LNAME FROM project1.workers INNER JOIN project1.order_status " +
            "ON workers.ID_WORKER = order_status.ID_WORKER INNER JOIN project1.orders ON orders.ID_ORDER = order_status.ID_ORDER " +
            "WHERE orders.ORDER_NUMBER = '"+ NrOrder +"' GROUP BY workers.FNAME, workers.LNAME");

            SQLdata.connection.Open();
            using (var command = new MySqlCommand(query1, SQLdata.connection))
            {
                using (var reader1 = command.ExecuteReader())
                {
                    while (reader1.Read())
                    {
                        fname = Convert.ToString(reader1[0]);
                        lname = Convert.ToString(reader1[1]);
                    }
                }
            }

            SQLdata.connection.Close();
            sick_leaves x = new sick_leaves();
            x.FNAME = fname;
            x.LNAME = lname;
            return x;         
        }
    }
}


Заказы.в CS

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

    namespace ControlDataBase
    {
        public class sick_leaves
        {
            public string FNAME { get; set; }
            public string LNAME { get; set; }
        }
    }


Методу sqldata.в CS

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MySql;
using MySql.Data.MySqlClient;

namespace ControlDataBase
{
    class SQLdata
    {
        public static MySqlConnection connection = new MySqlConnection
        ("datasource=localhost;port=3306;username=root;password=");
    }
}

2 Ответов

Рейтинг:
2

OriginalGriff

Посмотри, что ты делаешь.:

SQLdata.connection.Open();
   using (var command = new MySqlCommand(query1, SQLdata.connection))
   {
       using (var reader1 = command.ExecuteReader())
       {
           while (reader1.Read())
           {
               fname = Convert.ToString(reader1[0]);
               lname = Convert.ToString(reader1[1]);
           }
       }
   }
...
       SQLdata.connection.Close();
       sick_leaves x = new sick_leaves();
       x.FNAME = fname;
       x.LNAME = lname;
       return x;
Вы проходите через них все в цикле, но вы только "держите" последний - каждый раз, когда цикл перезаписывает предыдущие данные.
Что вы должны сделать, это собрать коллекцию предметов sick_leaves - это список<sick_leaves&ГТ; возможно - добавить новые экземпляры, что внутри вашего цикла, и вернуть коллекцию, а не один элемент.

И сделайте себе одолжение: следуйте правилам именования C#.
Ваш класс не должен быть "sick_leaves", он должен быть "SickLeave" - множественное число подразумевает коллекцию элементов, которой ваш класс не является; C# использует CamelCase не unscore и все строчные буквы.


Рейтинг:
1

phil.o

Когда вы просматриваете результаты datareader, вы назначаете fname и lname переменные, но ничего с ними не делайте. Их значения заменяются на следующей итерации. В конечном итоге вы получаете эти переменные, содержащие значения последний только запись.

Чтобы сохранить все результаты, вам нужно сохранить их значения в списке:

var names = new List<Tuple<string, string>>();
SQLdata.connection.Open();
using (var command = new MySqlCommand(query1, SQLdata.connection))
{
   using (var reader1 = command.ExecuteReader())
   {
      while (reader1.Read())
      {
         names.Add(Tuple.create((string)reader1[0], (string)reader1[1]));
      }
   }
}

Затем вы можете повторить список, чтобы получить все полученные результаты:
foreach (var name in names)
{
   fname = name.Item1;
   lname = name.Item2;
   // ...
}