C# 如何使用foreach循环更新数据库中的行?
我试图循环浏览订单表中的所有订单,并在调用此函数时更新每个订单的交货状态C# 如何使用foreach循环更新数据库中的行?,c#,sql,winforms,visual-studio,C#,Sql,Winforms,Visual Studio,我试图循环浏览订单表中的所有订单,并在调用此函数时更新每个订单的交货状态 public void DateCheck() { if (sqlcon.State == ConnectionState.Closed) { sqlcon.Open(); } SqlCommand cmd = new SqlCommand("SELECT * FROM Order
public void DateCheck()
{
if (sqlcon.State == ConnectionState.Closed)
{
sqlcon.Open();
}
SqlCommand cmd = new SqlCommand("SELECT * FROM Orders", sqlcon);
SqlDataAdapter sda = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
sda.Fill(dt);
foreach (DataRow row in dt.Rows)
{
SqlCommand update = new SqlCommand("UPDATE Orders SET D_Status = @D_Status", sqlcon);
string deliverytype = row["D_Type"].ToString();
DateTime orderdate = DateTime.ParseExact(row["O_Date"].ToString(), "dd/MM/yyyy", null);
DateTime deliverydate = new DateTime();
if (deliverytype == "Standard")
{
deliverydate = orderdate.AddDays(7);
}
else if (deliverytype == "Express")
{
deliverydate = orderdate.AddDays(5);
}
else if (deliverytype == "One-Day")
{
deliverydate = orderdate.AddDays(1);
}
if (DateTime.Now >= deliverydate)
{
update.Parameters.AddWithValue("@D_Status", "Delivered");
update.ExecuteNonQuery();
}
else if (DateTime.Now >= deliverydate)
{
update.Parameters.AddWithValue("@D_Status", "Undelivered");
update.ExecuteNonQuery();
}
}
}
但是,它会将所有状态更新为Delivered,即使比较下面的代码会得到Delivered和Undelivered
(DateTime.Now >= deliverydate)
有人知道代码哪里出错了吗?如果是这样,请详细说明,以帮助我更好地理解我的错误 这条线
DateTime deliveryDate = new DateTime();
创建等于01/01/0001 00:00:00的deliveryDate,当然,添加7、5或1天不会给您提供一个有意义的日期来与DateTime进行比较。现在
初始化deliveryDate变量的逻辑不清楚,但可能需要使用orderDate对其进行初始化
DateTime deliverydate = orderDate;
正如其他人在他们的评论中所说,不带WHERE条件的UPDATE命令会更新表中的所有记录。同样,这里需要某种初始化。可能是因为您使用SELECT*FROM语法,所以检索到的记录还包含记录的主键,因此您可以使用以下方法调整查询:
string cmdText = "UPDATE Orders SET D_Status = @D_Status WHERE OrderID = @id"
SqlCommand update = new SqlCommand(cmdText, sqlcon);
update.Parameters.AddWithValue("@id", Convert.ToInt32(row["OrderId"]));
.....
您必须在查询中添加where子句。否则,它将更新所有行 遵循Andrew Williamson的方法,您可以使用嵌套的case表达式更新表中的所有订单,而无需在c代码中设置任何条件: 创建并填充示例表请在以后的问题中保存此步骤
CREATE TABLE Orders
(
O_Id int identity(1,1),
D_Type varchar(10),
O_Date datetime,
D_Status varchar(20)
)
-- Today is 2017-11-27
INSERT INTO Orders (D_Type, O_Date, D_Status) VALUES
('Standard', '2017-12-19T00:00:00', NULL), -- expected result - 'Undelivered'
('Standard', '2017-12-01T00:00:00', NULL), -- expected result - 'Delivered'
('Express', '2017-12-20T00:00:00', NULL), -- expected result - 'Undelivered'
('Express', '2017-11-30T00:00:00', NULL), -- expected result - 'Delivered'
('One-Day', '2017-12-20T00:00:00', NULL), -- expected result - 'Undelivered'
('One-Day', '2017-11-27T00:00:00', NULL) -- expected result - 'Delivered'
更新声明:
UPDATE Orders
SET D_Status = CASE WHEN DATEADD(DAY
,
CASE D_Type
WHEN 'Standard' THEN
7
WHEN 'Express' THEN
5
WHEN 'One-Day' THEN
1
END
, GETDATE()) <= O_Date THEN
'Delivered'
ELSE
'Undelivered'
END
结果:
O_Id D_Type O_Date D_Status
1 Standard 19.12.2017 00:00:00 Delivered
2 Standard 01.12.2017 00:00:00 Undelivered
3 Express 20.12.2017 00:00:00 Delivered
4 Express 30.11.2017 00:00:00 Undelivered
5 One-Day 20.12.2017 00:00:00 Delivered
6 One-Day 27.11.2017 00:00:00 Undelivered
您尚未在update命令中写入任何条件..获取orderid并将条件添加到update命令您的update语句缺少where子句。这意味着它将更新表中的每一条记录。。。然后对于交货日期,我认为这会自动实现,因为我使用了foreach循环来遍历所有现有订单。但是,我不确定要为UPDATE命令设置什么条件?因为我只想更新该表中的所有数据。@LeonKho确定Orders表的主键,将其添加到一个变量中,并在update语句中添加其中Id=并将该变量作为参数传递。。这是正确的,并得到了适当的注意。但问题是:为什么我总是获得“已交付”的状态?@steve..因此它会更新最后一行的值delivered/not delivered到所有行..@AswaniMadhavan否,它会将所有记录更新为delivered,因为deliveryDate的初始化是错误的。这不仅仅是修复where条件的问题。@steve我看DeliveryDate没有任何问题foreach似乎不会自动循环遍历整个表,所以您提供的where条件起作用了!谢谢你的建议。我很抱歉没有提供样品表,我会注意的。然而,这只是一个小项目,我对SQL没有太多的接触,但更多的是针对C。一个聪明的人曾经告诉我,你可以用锤子砍木头,但用斧头更容易。
O_Id D_Type O_Date D_Status
1 Standard 19.12.2017 00:00:00 Delivered
2 Standard 01.12.2017 00:00:00 Undelivered
3 Express 20.12.2017 00:00:00 Delivered
4 Express 30.11.2017 00:00:00 Undelivered
5 One-Day 20.12.2017 00:00:00 Delivered
6 One-Day 27.11.2017 00:00:00 Undelivered