Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用foreach循环更新数据库中的行?_C#_Sql_Winforms_Visual Studio - Fatal编程技术网

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