0

我一直试图让它工作大约 6 个小时,但似乎无法在我的代码中找到解决方案或错误......

基本上,代码应该选择比当前日期/时间晚 2 分钟的日期/时间的每个实例,但由于某种原因,它只返回一个实例。我尝试了很多方法来解决这个问题,我不可能把它们都写下来。

我有两种方法removedexpiredusers()getexpiredusersdate().

Getexpiredusersdate()应该检索添加的每条记录的日期/时间并将它们提供给removeexpiredusers()应该使用该方法过滤掉哪些记录比当前日期晚两分钟以及是否删除它们。

两分钟的删除时间纯粹是为了测试,因为计划是在 24 小时后将其更改为删除用户帐户,为用户提供一天的临时帐户。

到目前为止,这是我的代码,任何帮助表示赞赏

private void removeExpiredUsers()
{
    while (DateTime.Now >= getExpiredUsersDate().AddMinutes(2))
    {
        //remove the user
        dal.spDeleteExpiredUsers(getExpiredUsersDate());
    }
}
private DateTime getExpiredUsersDate()
{
    DateTime date = new DateTime();
    try
    {
        using (SqlDataReader datareader = dal.getUsers())
        {
            while (datareader.Read())
            {
                date = ((DateTime)datareader["DateAdded"]);
                MessageBox.Show(date.ToString());
            }
        }
    }
    catch (SqlException sqlex) { }
    catch (Exception ex) { }

    return date;
}

编辑

我也要在这里包含存储过程

获取用户

Create proc spGetUsers
as
Begin
    SELECT * 
    FROM [User]
    ORDER BY Username
End

* spDeleteExpiredUsers

Create proc spDeleteExpiredUsers
@DateAdded datetime
as
Begin
    DELETE 
    FROM [User] 
    WHERE DateAdded = @DateAdded
End
4

2 回答 2

2

为什么不通过创建一个存储过程来简化这一点,该过程根据您的逻辑删除用户,即

DELETE FROM UserTable WHERE DATEDIFF(day,getdate(),DateAdded) < -1

然后,您可以使用ExecuteScalar(如果您想要影响的行数)从您的 .NET 应用程序调用此存储过程,如果您不需要任何结果,则只需ExecuteNonQuery 。

我认为最好在SQL server. 在发布删除之前,我倾向于仅C#在需要解析或应用一些业务规则时使用。如果是一个简单的时间比较来决定是否删除用户,那么保持简单。

编辑:我已经更新了 SQL,这将删除 1 天前添加的任何人。

于 2013-08-19T08:34:33.853 回答
2

基本上,代码应该选择比当前日期/时间晚 2 分钟的日期/时间的每个实例,但由于某种原因,它只返回一个实例。

您实际上在getExpiredUsersDate()方法中只返回一个日期(最后一组)。请改用列表。像这样的东西:

// Change return type to a list of DateTime's
private List<DateTime> getExpiredUsersDate()
{
    // Don't need this
    //DateTime date = new DateTime();

    var dates = new List<DateTime>();

    // The try-catch is unnecessary, 
    // the using-statement will catch all exceptions before the try-catch.
    //try
    //{
        using (SqlDataReader datareader = dal.getUsers())
        {
            while (datareader.Read())
            {
                // Add the date to the list.
                dates.Add((DateTime)datareader["DateAdded"]);

                MessageBox.Show(date.ToString());
            }
        }
    //}
    //catch (SqlException sqlex) { }
    //catch (Exception ex) { }

    // Return all dates.
    return dates;
}

更短的版本可能是:

private IEnumerable<DateTime> getExpiredUsersDate()
{
    using (SqlDataReader datareader = dal.getUsers())
    {
        while (datareader.Read())
        {
            yield return (DateTime)datareader["DateAdded"];

            MessageBox.Show(date.ToString());
        }
    }
}

然后removeExpiredUsers()你可以用linq做这样的事情:

private void removeExpiredUsers()
{
    var toRemove = getExpiredUsersDate()
        .Where(date => DateTime.Now >= date.AddMinutes(2));

    foreach (var date in toRemove)
    {
        dal.spDeleteExpiredUsers(date);
    }
}

但是你也可以在 christiandev 提到的 SQL 中完成所有这些工作。

于 2013-08-19T08:25:20.167 回答