Pro*_*991 8 .net c# mysql datagridview winforms
我已经声明了2个字符串变量:
string fname;
string lname;
Run Code Online (Sandbox Code Playgroud)
当我在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
Run Code Online (Sandbox Code Playgroud)
我有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]);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在while循环中使用了代码行中的断点,并读取了所有FNAME和LNAME。然后,它将正确加载所有数据。接下来,我要将它们加载到datagridview。
SQLdata.connection.Close();
sick_leaves x = new sick_leaves();
x.FNAME = fname;
x.LNAME = lname;
return x;
Run Code Online (Sandbox Code Playgroud)
并像这样绑定它们:
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;
Run Code Online (Sandbox Code Playgroud)
然后使用Orders.cs文件中的数据:
public class sick_leaves
{
public string FNAME { get; set; }
public string LNAME { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
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; }
}
}
Run Code Online (Sandbox Code Playgroud)
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=");
}
}
Run Code Online (Sandbox Code Playgroud)
代码中存在一些问题:
fname和定义lname为表单字段。calculate_sickness_leaves您设置这些字段的值中while(reader1.Read())sick_leaves从返回一个对象calculate_sickness_leaves。所以基本上,fname和lname将始终包含名字和你的表的最后一排的最后一个名字,是因为:1和2。
DataGridView由于3,您将始终显示一条记录。
解决问题:
fname,lname因为您不需要它们。calculate_sickness_leaves为IEnumerable<sick_leaves>。sick_leavesyield 的新实例将其返回。边注
例
您可以找到许多有关将数据加载到中DataTable或使用的示例DataReader。无论如何,我将在这里分享另外两个示例,向您展示如何从MySql获取数据并将其转换为特定类型的列表。
在以下示例中,我假设您有一个Employee类似的类:
public class Employee
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
示例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")
});
}
Run Code Online (Sandbox Code Playgroud)
示例2-使用DataReader并产生return新的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)
};
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用上述两种方法之一:
bindingSource.DataSource = GetEmployees();
dataGridView.DataSource = bindingSource;
Run Code Online (Sandbox Code Playgroud)
当我从 SQL 数据库下载数据并将其呈现在 DataGridView 中时,此代码适用于我:
string connectionString;
String sql = "";
SqlConnection cnn;
sql = "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"";
connectionString = @"datasource=localhost;port=3306;username=root;password=";
cnn = new SqlConnection(connectionString);
cnn.Open();
SqlDataAdapter dataadapter = new SqlDataAdapter(sql, cnn);
DataSet ds = new DataSet();
dataadapter.Fill(ds, "workers");
dataGridView1.DataSource = ds;
dataGridView1.DataMember = "workers";
cnn.Close();
Run Code Online (Sandbox Code Playgroud)