C# 如何在mySQL中检索数据并将其放在datagridview的特定单元格中
我想把数据库中的C# 如何在mySQL中检索数据并将其放在datagridview的特定单元格中,c#,datagridview,mysqldatareader,C#,Datagridview,Mysqldatareader,我想把数据库中的数量列放在datagridview中,datagridview中首先加载了数据,包括数量列和5列。现在我尝试在数据库中加载列quantity。这是我的密码: using (MySqlConnection con = new MySqlConnection(serverstring)) { string query = @"SELECT quantity FROM tblOrder_Products
数量列放在datagridview中,datagridview中首先加载了数据,包括数量列和5列。现在我尝试在数据库中加载列quantity
。这是我的密码:
using (MySqlConnection con = new MySqlConnection(serverstring))
{
string query = @"SELECT quantity
FROM tblOrder_Products
WHERE order_ID=@ID";
con.Open();
using (MySqlCommand cmd = new MySqlCommand(query, con))
{
DataTable dt = new DataTable();
cmd.Parameters.AddWithValue("@ID", txtboxID.Text);
MySqlDataReader dr = cmd.ExecuteReader();
dt.Load(dr);
dr.Close();
dataGridView2.DataSource = dt;
// I want to change this line or this part of code because
// I want to put only the column `quantity` which means
//retaining the data loaded previously in the datagridview
}
因此,我的问题是,如何将其放入datagridview中,而不删除或覆盖加载在其中的前一个?如果我理解正确,您已经用数据填充了网格,并且希望更改属于列Quantity
的单元格的内容,并引用使用ID
单元格查找数据库中更新值的行
在这种情况下,您不应该使用datatable重新绑定网格,只需执行命令,检索更新后的值,并为请求ID的行设置单元格数量
using (MySqlCommand cmd = new MySqlCommand(query, con))
{
cmd.Parameters.AddWithValue("@ID", txtboxID.Text);
object result = cmd.ExecuteScalar();
if(result != null)
{
int quantity = Convert.ToInt32(result);
// Now you need to find the row that contains the ID passed
DataGridViewRow row = grid.Rows
.Cast<DataGridViewRow>()
.Where(r => r.Cells["ID"].Value.ToString().Equals(txtBoxID.Text))
.First();
row.Cells["Quantity"].Value = quantity;
}
}
使用(MySqlCommand cmd=newmysqlcommand(query,con))
{
cmd.Parameters.AddWithValue(“@ID”,txtboxID.Text);
object result=cmd.ExecuteScalar();
如果(结果!=null)
{
整数数量=转换为32(结果);
//现在您需要找到包含传递的ID的行
DataGridViewRow行=grid.Rows
.Cast()
.Where(r=>r.Cells[“ID”].Value.ToString().Equals(txtBoxID.Text))
.First();
行.单元格[“数量”]。值=数量;
}
}
更新
在您的评论之后,现在很明显您有许多查询返回的记录,并且您希望更新DataGridView中的许多行。
这可以通过以下改变来实现:
// The query returns also the Variant column from the database
// The column is needed to identify the corresponding row to update on the datagridview
// Also I am supposing that the variant column is from the same table (JOIN required otherwise)
string query = @"SELECT variant, quantity
FROM tblOrder_Products
WHERE order_ID=@ID";
con.Open();
using (MySqlCommand cmd = new MySqlCommand(query, con))
{
cmd.Parameters.AddWithValue("@ID", txtboxID.Text);
// Cannot use a ExecuteScalar, we need a SqlDataReader to loop over the results
SqlDataReader reader = cmd.ExecuteReader();
while(reader.Read())
{
int quantity = reader.GetInt32(1);
// Now I am supposing the the Variant column is of string type, change the Get
// accordingly if it is not
string v = reader.GetString(0);
// Use the value retrieved from the database to identify the row to update
DataGridViewRow row = grid.Rows
.Cast<DataGridViewRow>()
.Where(r => r.Cells["variant"].Value.ToString().Equals(v))
.First();
row.Cells["Quantity"].Value = quantity;
}
}
//查询还返回数据库中的Variant列
//该列用于标识要在datagridview上更新的对应行
//我还假设variant列来自同一个表(否则需要连接)
字符串查询=@“选择变量,数量”
来自tblOrder_产品
其中order_ID=@ID”;
con.Open();
使用(MySqlCommand cmd=newmysqlcommand(query,con))
{
cmd.Parameters.AddWithValue(“@ID”,txtboxID.Text);
//无法使用ExecuteScalar,我们需要一个SqlDataReader来循环结果
SqlDataReader=cmd.ExecuteReader();
while(reader.Read())
{
int数量=reader.GetInt32(1);
//现在我假设Variant列是string类型,更改Get
//因此,如果不是
string v=reader.GetString(0);
//使用从数据库检索的值来标识要更新的行
DataGridViewRow行=grid.Rows
.Cast()
.Where(r=>r.Cells[“variant”].Value.ToString().Equals(v))
.First();
行.单元格[“数量”]。值=数量;
}
}
是的,这就是我想做的。非常感谢。我将尝试您的代码。我正在尝试理解代码,但当我阅读注释时,现在您需要找到包含传递的ID的行
,这意味着datagridview属于多个ID,但在我的情况下,这并不是因为datagridview只属于一个ID。例如,在我的情况下,我有一个名为variant
的列每个变量名称都有其数量
,但它只属于一个ID。但这意味着您的查询返回多个DataRow。如果这是真的,那么您需要更改查询以同时返回一个标识符(变量列),该标识符有助于查找DataGridViewRow,以使用从数据库加载的新数量进行更新(并且您不能使用ExecuteScalar)。是的,它返回多行。好的…那么什么是正确的查询?我要使用连接吗?要将datagridview中加载的变量名称与其数据库中的数量相匹配,请执行以下操作:DataGridViewRow row=grid.Rows
grid.Rows无效。我的意思是它没有出现在智能意义上。