Сравнение SQL Server DATETIME с DateTime.NOW в C # / ASP.NET - PullRequest
0 голосов
/ 05 ноября 2018

Как сравнить SQL Server DATETIME со значением DateTime.Now? Как видите, я назначил сеанс и попытался сравнить его с 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;
            }
        }        
    }
}

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Во-первых, ваш 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;
    }
}
0 голосов
/ 05 ноября 2018
  1. Вы должны передать дату и выполнить сравнение в запросе, а не в c #. Это на один шаг меньше. Если вы хотите сделать это в c #, используйте соответствующие типы, не конвертируйте DateTime в строку, а затем снова конвертируйте обратно.
  2. Нет необходимости в соединении (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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...