无法在另一个 foreach mysql C# 内的 foreach 循环中获取 Last_inserted_id
Cannot Fetch the Last_inserted_id in a foreach loop inside another foreach mysql C#
上图显示了 mysql 表中的输出。
我的问题是它无法获取 ORDERTABLE 中 last_inserted_id 值的值,因为它是 ItemTable itemid.
中的参考值
这是我在 SAVEORDER 和 SAVEITEM 中的代码
描述 = 是我将数据拆分为 foreach 并将其保存在项目 table 中的位置。
每个拆分应该用相应的 orderid 保存每个数据,我尝试了 last_inserted_id 而不是 MaxID,因为我希望它由 1-3 个用户同时完成而不会出现数据完整性问题。
private void SaveOrder()
{
try
{
foreach (DataGridViewRow row in DGSingleOrders.Rows)
{
using (MySqlCommand cmd = new MySqlCommand())
{
cmd.CommandText = "INSERT INTO single_order (customerid, category, type, description, code, color, price, status, transaction, attendee) VALUES (@customerid, @category, @type, @description, @code, @color, @price, @status, @transaction, @attendee)";
cmd.CommandType = CommandType.Text;
cmd.Connection = db.con;
db.con.Open();
cmd.Parameters.Add("@customerid", MySqlDbType.VarChar).Value = OrderID;
cmd.Parameters.Add("@category", MySqlDbType.VarChar).Value = row.Cells[0].Value.ToString();
cmd.Parameters.Add("@type", MySqlDbType.VarChar).Value = row.Cells[1].Value.ToString();
cmd.Parameters.Add("@description", MySqlDbType.VarChar).Value = row.Cells[2].Value.ToString();
cmd.Parameters.Add("@code", MySqlDbType.VarChar).Value = row.Cells[3].Value.ToString();
cmd.Parameters.Add("@color", MySqlDbType.VarChar).Value = row.Cells[4].Value.ToString();
cmd.Parameters.Add("@price", MySqlDbType.VarChar).Value = row.Cells[5].Value.ToString();
cmd.Parameters.Add("@status", MySqlDbType.VarChar).Value = SaveAs;
cmd.Parameters.Add("@transaction", MySqlDbType.VarChar).Value = DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss tt");
cmd.Parameters.Add("@attendee", MySqlDbType.VarChar).Value = attendee;
cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
db.con.Close();
}
//Check this first
using (MySqlCommand cmd = new MySqlCommand())
{
cmd.CommandText = "SELECT LAST_INSERT_ID()";
cmd.Connection = db.con;
db.con.Open();
using (MySqlDataReader reader = cmd.ExecuteReader())
{
long id;
while (reader.Read())
{
id = reader.GetInt64(0);
ItemID = id.ToString();
}
db.con.Close();
}
}
}
}
catch (Exception e)
{
MessageBox.Show(e.Message,"ORDER");
db.con.Close();
return;
}
}
private void SaveItem()
{
//Getting Each Data
foreach (DataGridViewRow row in DGSingleOrders.Rows)
{
string item = row.Cells[1].Value.ToString();
string type = row.Cells[0].Value.ToString();
string str = row.Cells[2].Value.ToString();
string code = row.Cells[3].Value.ToString();
string color = row.Cells[4].Value.ToString();
List<string> descr = str.Split('+').ToList<string>();
//Splitting Description
//Adding Split to a DataTable
foreach (var l in descr)
{
OrderRow = l;
try
{
using (MySqlCommand cmd = new MySqlCommand())
{
cmd.CommandText = "INSERT INTO single_item (orderid, type, item, brand, code, color, eventdate, orderstatus, itemstatus, orderchecker, attendee)VALUES(@orderid, @type, @item, @brand, @code, @color, @eventdate, @orderstatus, @itemstatus, @orderchecker, @attendee)";
cmd.CommandType = CommandType.Text;
cmd.Connection = db.con;
cmd.Parameters.Add("@orderid", MySqlDbType.VarChar).Value = ItemID;
cmd.Parameters.Add("@type", MySqlDbType.VarChar).Value = type;
cmd.Parameters.Add("@item", MySqlDbType.VarChar).Value = OrderRow;
cmd.Parameters.Add("@brand", MySqlDbType.VarChar).Value = "-";
cmd.Parameters.Add("@code", MySqlDbType.VarChar).Value = code;
cmd.Parameters.Add("@color", MySqlDbType.VarChar).Value = color;
cmd.Parameters.Add("@eventdate", MySqlDbType.VarChar).Value = eventDay;
cmd.Parameters.Add("@orderstatus", MySqlDbType.VarChar).Value = SaveAs;
cmd.Parameters.Add("@itemstatus", MySqlDbType.VarChar).Value = "Good";
cmd.Parameters.Add("@orderchecker", MySqlDbType.VarChar).Value = "Not Updated";
cmd.Parameters.Add("@attendee", MySqlDbType.VarChar).Value = atendee;
db.con.Open();
cmd.ExecuteNonQuery();
db.con.Close();
dtItems.Clear();
}
}
catch (Exception e)
{
MessageBox.Show(e.Message);
db.con.Close();
return;
}
SaveItem();
}
}
我添加了 SaveItem(); SaveOrder() 中的方法; ForeachLoop 以便它可以与 ORDER table 一起保存,并且可以获取 Last_inserted_id 的数据但它仍然获得第一个 ID,我也尝试将它放在 foreach 循环中,但是我不能' t获取Order ID的结果,保存数据不同
所以我想通了。
而不是使用 SELECT LAST_INSERT_ID(),它有一些文档表明它仅 returns 已插入的第一个 ID。 Bradley Grainger 提议使用 MySqlCommand.InsertLastId;
我修改成这样了
cmd.ExecuteNonQuery();
cmd.Parameters.Add(new MySqlParameter("newId", cmd.LastInsertedId));
ItemID = Convert.ToInt32(cmd.Parameters["@newId"].Value);
MessageBox.Show(ItemID.ToString());
```
now it is working. It can fetch the lastInserted iD in each loop, and the beauty of it is it can be threadsafe and can work along with simultaneous insert.
Also this link help me. https://livshitz.wordpress.com/2011/10/28/returning-last-inserted-id-in-c-using-mysql-db-provider/
您可以使用 MySqlCommand.LastInsertedId
获取刚刚插入的行的 ID,而无需单独查询。它还保证包含正确的值,因为它直接来自 MySQL 对 INSERT
语句的响应。
long itemId;
using (MySqlCommand cmd = new MySqlCommand())
{
cmd.CommandText = "INSERT INTO single_order (customerid, ...";
// ...
cmd.ExecuteNonQuery();
itemId = cmd.LastInsertedId;
}
// ...
using (MySqlCommand cmd = new MySqlCommand())
{
cmd.CommandText = "INSERT INTO single_item (orderid, ...";
cmd.Parameters.AddWithValue("@orderid", itemID);
// ...
}
上图显示了 mysql 表中的输出。 我的问题是它无法获取 ORDERTABLE 中 last_inserted_id 值的值,因为它是 ItemTable itemid.
中的参考值这是我在 SAVEORDER 和 SAVEITEM 中的代码
描述 = 是我将数据拆分为 foreach 并将其保存在项目 table 中的位置。 每个拆分应该用相应的 orderid 保存每个数据,我尝试了 last_inserted_id 而不是 MaxID,因为我希望它由 1-3 个用户同时完成而不会出现数据完整性问题。
private void SaveOrder()
{
try
{
foreach (DataGridViewRow row in DGSingleOrders.Rows)
{
using (MySqlCommand cmd = new MySqlCommand())
{
cmd.CommandText = "INSERT INTO single_order (customerid, category, type, description, code, color, price, status, transaction, attendee) VALUES (@customerid, @category, @type, @description, @code, @color, @price, @status, @transaction, @attendee)";
cmd.CommandType = CommandType.Text;
cmd.Connection = db.con;
db.con.Open();
cmd.Parameters.Add("@customerid", MySqlDbType.VarChar).Value = OrderID;
cmd.Parameters.Add("@category", MySqlDbType.VarChar).Value = row.Cells[0].Value.ToString();
cmd.Parameters.Add("@type", MySqlDbType.VarChar).Value = row.Cells[1].Value.ToString();
cmd.Parameters.Add("@description", MySqlDbType.VarChar).Value = row.Cells[2].Value.ToString();
cmd.Parameters.Add("@code", MySqlDbType.VarChar).Value = row.Cells[3].Value.ToString();
cmd.Parameters.Add("@color", MySqlDbType.VarChar).Value = row.Cells[4].Value.ToString();
cmd.Parameters.Add("@price", MySqlDbType.VarChar).Value = row.Cells[5].Value.ToString();
cmd.Parameters.Add("@status", MySqlDbType.VarChar).Value = SaveAs;
cmd.Parameters.Add("@transaction", MySqlDbType.VarChar).Value = DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss tt");
cmd.Parameters.Add("@attendee", MySqlDbType.VarChar).Value = attendee;
cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
db.con.Close();
}
//Check this first
using (MySqlCommand cmd = new MySqlCommand())
{
cmd.CommandText = "SELECT LAST_INSERT_ID()";
cmd.Connection = db.con;
db.con.Open();
using (MySqlDataReader reader = cmd.ExecuteReader())
{
long id;
while (reader.Read())
{
id = reader.GetInt64(0);
ItemID = id.ToString();
}
db.con.Close();
}
}
}
}
catch (Exception e)
{
MessageBox.Show(e.Message,"ORDER");
db.con.Close();
return;
}
}
private void SaveItem()
{
//Getting Each Data
foreach (DataGridViewRow row in DGSingleOrders.Rows)
{
string item = row.Cells[1].Value.ToString();
string type = row.Cells[0].Value.ToString();
string str = row.Cells[2].Value.ToString();
string code = row.Cells[3].Value.ToString();
string color = row.Cells[4].Value.ToString();
List<string> descr = str.Split('+').ToList<string>();
//Splitting Description
//Adding Split to a DataTable
foreach (var l in descr)
{
OrderRow = l;
try
{
using (MySqlCommand cmd = new MySqlCommand())
{
cmd.CommandText = "INSERT INTO single_item (orderid, type, item, brand, code, color, eventdate, orderstatus, itemstatus, orderchecker, attendee)VALUES(@orderid, @type, @item, @brand, @code, @color, @eventdate, @orderstatus, @itemstatus, @orderchecker, @attendee)";
cmd.CommandType = CommandType.Text;
cmd.Connection = db.con;
cmd.Parameters.Add("@orderid", MySqlDbType.VarChar).Value = ItemID;
cmd.Parameters.Add("@type", MySqlDbType.VarChar).Value = type;
cmd.Parameters.Add("@item", MySqlDbType.VarChar).Value = OrderRow;
cmd.Parameters.Add("@brand", MySqlDbType.VarChar).Value = "-";
cmd.Parameters.Add("@code", MySqlDbType.VarChar).Value = code;
cmd.Parameters.Add("@color", MySqlDbType.VarChar).Value = color;
cmd.Parameters.Add("@eventdate", MySqlDbType.VarChar).Value = eventDay;
cmd.Parameters.Add("@orderstatus", MySqlDbType.VarChar).Value = SaveAs;
cmd.Parameters.Add("@itemstatus", MySqlDbType.VarChar).Value = "Good";
cmd.Parameters.Add("@orderchecker", MySqlDbType.VarChar).Value = "Not Updated";
cmd.Parameters.Add("@attendee", MySqlDbType.VarChar).Value = atendee;
db.con.Open();
cmd.ExecuteNonQuery();
db.con.Close();
dtItems.Clear();
}
}
catch (Exception e)
{
MessageBox.Show(e.Message);
db.con.Close();
return;
}
SaveItem();
}
}
我添加了 SaveItem(); SaveOrder() 中的方法; ForeachLoop 以便它可以与 ORDER table 一起保存,并且可以获取 Last_inserted_id 的数据但它仍然获得第一个 ID,我也尝试将它放在 foreach 循环中,但是我不能' t获取Order ID的结果,保存数据不同
所以我想通了。
而不是使用 SELECT LAST_INSERT_ID(),它有一些文档表明它仅 returns 已插入的第一个 ID。 Bradley Grainger 提议使用 MySqlCommand.InsertLastId;
我修改成这样了
cmd.ExecuteNonQuery();
cmd.Parameters.Add(new MySqlParameter("newId", cmd.LastInsertedId));
ItemID = Convert.ToInt32(cmd.Parameters["@newId"].Value);
MessageBox.Show(ItemID.ToString());
```
now it is working. It can fetch the lastInserted iD in each loop, and the beauty of it is it can be threadsafe and can work along with simultaneous insert.
Also this link help me. https://livshitz.wordpress.com/2011/10/28/returning-last-inserted-id-in-c-using-mysql-db-provider/
您可以使用 MySqlCommand.LastInsertedId
获取刚刚插入的行的 ID,而无需单独查询。它还保证包含正确的值,因为它直接来自 MySQL 对 INSERT
语句的响应。
long itemId;
using (MySqlCommand cmd = new MySqlCommand())
{
cmd.CommandText = "INSERT INTO single_order (customerid, ...";
// ...
cmd.ExecuteNonQuery();
itemId = cmd.LastInsertedId;
}
// ...
using (MySqlCommand cmd = new MySqlCommand())
{
cmd.CommandText = "INSERT INTO single_item (orderid, ...";
cmd.Parameters.AddWithValue("@orderid", itemID);
// ...
}