C# SQL数据表日期时间更新

C# SQL数据表日期时间更新,c#,sql,date,datetime,C#,Sql,Date,Datetime,所以,我的问题很复杂,很难解释。 我有一个名为“Members”的数据表(SQL),列为“Lengh”。 所以我想,每次启动程序时,检查是否有长度低于当前日期时间,并检查“状态”列是否过期。如果表中只有一行,它可以正常工作,但是如果有更多行,它只会更改一行。如何更改“长度”低于当前日期时间的所有行 InitializeComponent(); SqlDataAdapter dt = new SqlDataAdapter("Select Lengh From Members",co

所以,我的问题很复杂,很难解释。 我有一个名为“Members”的数据表(SQL),列为“Lengh”。 所以我想,每次启动程序时,检查是否有长度低于当前日期时间,并检查“状态”列是否过期。如果表中只有一行,它可以正常工作,但是如果有更多行,它只会更改一行。如何更改“长度”低于当前日期时间的所有行

InitializeComponent();
        SqlDataAdapter dt = new SqlDataAdapter("Select Lengh From Members",con);
        DataTable adt = new DataTable();
        dt.Fill(adt);
        DateTime now = DateTime.Now;
        DateTime chip = (DateTime)adt.Rows[0][0];
        if (now>chip)
        {
            SqlDataAdapter dt2 = new SqlDataAdapter("Select [Reconizing ID] From Members Where [Lengh]='" + chip + "'", con);
            DataTable adt2 = new DataTable();
            dt2.Fill(adt2);
            string kd = "Update Members Set Status='" + "Expired" + "' Where [Reconizing ID]='" + adt2.Rows[0][0] + "'";
            SqlCommand cmd = new SqlCommand(kd,con);
            con.Open();
            cmd.ExecuteNonQuery();
            con.Close();
        }

如果我执行无限循环,程序在启动前就会崩溃

您可以使用纯sql解决方案来解决此问题。 一次更新所有案例的sql语句如下所示

UPDATE MEMBERS SET STATUS = 'Expired' WHERE LENGH < ?
当然,这假定
LENGH
是数据库中的日期类型列

注释1:如果您期望大量行(百万),那么考虑在<代码> Lengh < /Cuff>列上建立索引,以便更好地查询性能。


注2:一些应用程序和数据库在多个时区工作,或者有时应用程序服务器和数据库服务器之间会有时差。在我看来,从应用程序代码中传递日期-时间是一种很好的编码实践。

为什么不在一个查询中完成呢?比如:

string query="UPDATE Members SET Status='Expired' WHERE @now>Lengh";
SqlCommand cmd= new SqlCommand(query,con);
cmd.Parameters.AddWithValue("@now",DateTime.Now);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
考虑到您的长度列是DateTime类型,您可以使用以下查询一次性更新该列

UPDATE Members SET Status ='Expired' WHERE Length < GETDATE()
updatemembers SET Status='Expired'其中Length
长度是否小于当前日期?似乎是一种非常奇怪的情况。它说
Lengh
。。。不确定是打字错误,还是外语…还有海报:你需要使用循环。可能两个表
adt
adt2
都有多行,但您总是只取第一行(
adt.rows[0]
),然后取第一列(
adt.rows[0][0]
)。与adt2相同。您应该始终使用。这类字符串连接会受到攻击。用于自动处理连接、命令和适配器,而不是手动调用
Close
dispose
方法。我已尝试过,但它会给我带来转换错误或类似错误。。那么@now意味着什么呢?顺便说一句,它很有效,thx很多。。@now表示它现在将使用DateTime?请给出它抛出的确切错误。要了解
@now
的含义,请参见示例。
@now
是一个参数,并被
cmd.Parameters.AddWithValue(“@now”,DateTime.now”)中所需的值替换UPDATE Members SET Status ='Expired' WHERE Length < GETDATE()