我已经声明了2个字符串变量:

string fname;
string lname;

当我在phpMyAdmin数据库中编写MySQL查询时:
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个炒锅:

-“亚当·加克斯”和

“安德鲁·沃尔姆(Andrew Worm)”

然后,我想从该查询存储对象,并将该数据加载到datagridview:
    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]);
            }
        }
    }

我在while循环中使用了代码行中的断点,并读取了所有FNAME和LNAME。然后,它将正确加载所有数据。接下来,我要将它们加载到datagridview。
        SQLdata.connection.Close();
        sick_leaves x = new sick_leaves();
        x.FNAME = fname;
        x.LNAME = lname;
        return x;

并像这样绑定(bind)它们:
        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个Worker:“Andrew Worm”。那应该是2个worker,所以它没有从sql查询中加载所有数据。

现在:如何将所有数据从sql查询加载到datagridview?有任何想法吗? 警告!我需要桌面应用程序中的帮助

编辑

我想通过保存代码结构来加载该数据,因为我想通过计算疾病来构建该datagridview,从而节省了时间。 (带有TimeSpan对象)。有可能这样写吗?

我的代码:

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;
        }
    }
}

Orders.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=");
    }
}

最佳答案

代码中存在一些问题:

  • 您已将fnamelname定义为表单字段。
  • 中的
  • 您可以在calculate_sickness_leaves中设置这些字段的值
  • 最后,从while(reader1.Read())返回单个sick_leaves对象。

  • 因此,基本上,calculate_sickness_leavesfname将始终包含表最后一行的名字和姓氏,因为1和2。

    由于3,您的lname将始终显示一条记录。

    解决问题:
  • 不需要时删除DataGridViewfname
  • lname的输出类型更改为calculate_sickness_leaves
  • 在while循环中,当从数据读取器中读取字段值时,创建一个IEnumerable<sick_leaves> yield的新实例将其返回。

  • 旁注
  • 始终使用参数化查询来防止SQL注入(inject)。
  • 处理诸如连接之类的一次性对象时,请始终使用sick_leaves语句。
  • 如果您有兴趣使用类型化的实体对象,则可能需要看看MySQL ConnectorEntity Framework

  • 示例

    您可以找到许多有关将数据加载到using或使用DataTable的示例。无论如何,我将在这里分享另外两个示例,向您展示如何从MySql获取数据并将其转换为特定类型的列表。

    在以下示例中,我假设您具有这样的DataReader类:
    public class Employee
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
    

    示例1-使用DataAdapter,DataTable和Select扩展方法
    public IEnumerable<Employee> GetEmployees()
    {
        string connectionString = "CONNECTION STRING";
        string commandText = "COMMAND TEXT";
        DataTable table = new DataTable();
        using (var adapter = new MySqlDataAdapter(commandText , connectionString))
            adapter.Fill(table);
        return table.AsEnumerable().Select(x => new Employee()
        {
            FirstName = x.Field<string>("FirstName"),
            LastName = x.Field<string>("LastName")
        });
    }
    

    示例2-使用DataReader并让其返回新的Employee
    public IEnumerable<Employee> GetEmployees()
    {
        string connectionString = "CONNECTION STRING";
        string commandText = "COMMAND TEXT";
        using (var connection = new MySqlConnection(connectionString))
        {
            connection.Open();
            using (var command = new MySqlCommand(commandText, connection))
            {
                using (var reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        yield return new Employee()
                        {
                            FirstName = reader.GetFieldValue<string>(0),
                            LastName = reader.GetFieldValue<string>(1)
                        };
                    }
                }
            }
        }
    }
    

    您可以使用上述两种方法之一:
    bindingSource.DataSource = GetEmployees();
    dataGridView.DataSource = bindingSource;
    

    10-02 09:38
    查看更多