从sql数据库中检索记录时出现循环问题

时间:2013-08-19 08:08:12

标签: c# sql sql-server

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

基本上代码应该选择每个日期/时间的实例,它是当前日期/时间之后的2分钟但由于某种原因它只返回一个实例。我已经尝试了很多方法来解决这个问题,我无法将它们全部写下来。

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

Getexpiredusersdate()应该检索每个记录添加的日期/时间并将其提供给removeexpiredusers()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; } 应使用该方法过滤掉当前日期后两分钟的记录以及是否删除它们。

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

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

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

修改

我将在这里也包括存储过程

GetUsers

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

*的 spDeleteExpiredUsers

{{1}}

2 个答案:

答案 0 :(得分:2)

  

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

您实际上只返回{​​{1}}方法中的一个日期(最后一组)。请改用列表。有点像这样:

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()); } } } 你可以用linq做这样的事情:

removeExpiredUsers()

但是你也可以在基督徒提到的SQL中做所有这些。

答案 1 :(得分:2)

为什么不通过根据您的逻辑创建删除用户的存储过程来简单地解决这个问题,即

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

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

我认为在SQL server处理这样的事情会更好。如果在发出删除之前需要解析或应用某些业务规则,我倾向于仅使用C#。如果这是一个简单的时间比较决定用户是否被删除,那么保持简单。

编辑:我已经提升了SQL,这将删除1天前添加的更多内容。