c# - 如何将数据从sql查询加载到datagridview?

标签 c# mysql .net winforms datagridview

我已经声明了 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 个工作人员:

-“亚当盖克斯”和

“安德鲁蠕虫”

然后我想存储来自这个查询的对象并将该数据加载到 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 个工作人员,所以它没有从 sql 查询加载所有数据。

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

编辑

我想通过保存代码结构来加载该数据,因为我想通过计算疾病来构建数据 GridView ,留下时间。 (使用 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=");
    }
}

最佳答案

代码中有几个问题:

  1. 您已经定义了fnamelname作为表单的字段。
  2. calculate_sickness_leaves您在 while(reader1.Read()) 中设置这些字段的值
  3. 最后返回一个 sick_leaves来自 calculate_sickness_leaves 的对象.

所以基本上,fnamelname由于1和2。

你的 DataGridView将始终显示单个记录,因为 3.

解决问题:

  1. 删除 fnamelname因为你不需要它们。
  2. 更改 calculate_sickness_leaves 的输出类型至 IEnumerable<sick_leaves> .
  3. 在 while 循环中,当从数据读取器读取字段值时,创建一个新实例 sick_leaves yield 返回它。

旁注

  • 始终使用参数化查询来防止 SQL 注入(inject)。
  • 始终使用 using使用连接等一次性对象时的声明。
  • 如果您有兴趣使用类型化实体对象,那么您可能想看看 MySQL Connector对于 Entity Framework .

示例

你可以找到很多关于加载数据到DataTable的例子或使用 DataReader .不管怎样,我将在这里再分享两个示例,向您展示如何从 MySql 获取数据并将其转换为特定类型的列表。

在以下示例中,我假设您有一个 Employee像这样上课:

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 和 yield return new 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;

关于c# - 如何将数据从sql查询加载到datagridview?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57107064/

相关文章:

c# - WAV播放后C#SoundPlayer静态

c# - 使用 C#,如何替换相似的单词?

mysql - 对两个没有连接的表进行组合 SELECT 查询

.net - 如何打开选择了特定文件夹的 Windows 资源管理器窗口

c# - 如何在 64 位项目中引用 32 位 DLL?

.net - 检测到重入

c# - 在 Javascript 中处理 ActiveX 控件异常 (C#)

c# - 如何在 C# 中遗漏 ZedGraph 线图中的点

php - Yii createCommand 与标准

mysql - 子查询 vs Join 以及 where - 哪一个更快?