簡體   English   中英

在C#/ ASP.NET中將SQL Server DATETIME與DateTime.NOW進行比較

[英]Comparing SQL Server DATETIME with DateTime.NOW in C# / ASP.NET

如何將SQL Server DATETIMEDateTime.Now值進行比較? 如您所見,我將其分配給Session並嘗試將其與DateTime.Now進行比較。

string timestamp = @"SELECT sr.*, ud.* FROM SuspensionRecord sr, UserData ud WHERE sr.User_ID=@User_ID AND ud.User_ID=@User_ID";

using (SqlCommand cmd2 = new SqlCommand(timestamp, con))
{
    cmd2.Parameters.AddWithValue("@User_ID", Session["UserID"].ToString());

    using (SqlDataReader dr = cmd2.ExecuteReader())
    {
        if (dr.HasRows)
        {
            while (dr.Read())
            {
                Session["suspensiondate"] = dr["End_Date_Suspension"].ToString();
            }

            if (Convert.ToDateTime(Session["supensiondate"]) >= DateTime.Now.Date)
            {
                lblMessage.Text = "The account's status is suspended.";
                lblMessage.Visible = true;
            }
        }        
    }
}
  1. 您應該傳遞日期並在查詢中而不是在c#中進行比較。 這少了一步。 如果您確實想在c#中使用適當的類型,請不要將DateTime轉換為字符串,然后再次將其轉換回。
  2. 您的查詢中無需聯接(第二張表)
  3. 您不必為此使用DataReader,可以使用ExecuteScalar來返回1值。
  4. 使用Add以便您可以使用SqlDbType而不是AddWithValue指定正確的架構類型
string timestamp = @"SELECT 1 FROM SuspensionRecord sr WHERE sr.User_ID = @User_ID AND supensiondate > @now";
using (SqlCommand cmd2 = new SqlCommand(timestamp, con))
{
    cmd2.Parameters.Add("@User_ID", SqlDbType.Int).Value = Session["UserID"]; // do not convert to string
    cmd2.Parameters.Add("@now", SqlDbType.DateTime).Value = DateTime.Now.Date;
    var result = cmd2.ExecuteScalar();
    if(result != null) // if null then there were no records so account is not suspended
    {
        lblMessage.Text = "The account's status is suspended.";
        lblMessage.Visible = true;
    }
}

首先,您的SQL很糟糕。
您正在返回太多數據,並且您正在使用隱式聯接(當顯式聯接成為ANSI-SQL的一部分已有近30年的歷史了!)

第二, 我們可以停止使用AddWithValue()嗎?

代替所有這些代碼,您可以對SQL進行整個測試並返回一個值:

string sql = 
@"SELECT CASE WHEN EXISTS
  (
      SELECT 1 
      FROM SuspensionRecord 
      WHERE User_ID = @User_ID 
      AND End_Date_Suspension >= CAST(GETDATE() AS DATE)
  ) THEN 1 ELSE 0 END";

然后,您可以使用ExecuteScalar而不是ExecuteReader ,並且不需要遍歷所有不相關的數據:

using (SqlCommand cmd2 = new SqlCommand(timestamp, con))
{
    cmd2.Parameters.Add("@User_ID", SqlDbType.Int).Value = Session["UserID"];
    if ((int)cmd2.ExecuteScalar() == 1)
    {
        lblMessage.Text = "The account's status is suspended.";
        lblMessage.Visible = true;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM