2013-08-19 65 views
0

我一直努力现在得到这个工作约6小时,不能似乎找到解决方案或在我的代码中的错误...While循环问题,当从SQL数据库检索记录

基本上代码应该选择查看当前日期/时间后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; 
} 

编辑

我要去这里包括存储过程也家伙

GetUsers

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 
+1

你应该注释掉所有'try-catch'块,以便我们可以更好地进行调试。 –

+0

但是,消息框显示所有用户或只是一个?因为你只返回最后一个日期,并且只有最后一个日期在执行删除操作的if中被选中 – Steve

+0

@Steve Hi steve,它只显示一个用户,是否应该有一种方法来提供其他日期? –

回答

2

你为什么不通过创建一个存储过程,而删除其中根据你的逻辑用户simplyfy这一点,即

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

然后,您可以使用ExecuteScalar您的.NET应用程序中调用这个存储过程(如果您如果您不需要任何结果,则只需要ExecuteNonQuery)。

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

编辑:我已经升级了SQL,这会删除1天前添加的任何人。

+0

你正在使用的RegisteredDate()函数是什么? –

+0

这只是psuedo代码,应该是'DateAdded'(现在我再次查看代码)。 – christiandev

+0

ChristianDev,这段代码是否会检索当前日期并将其与表中的日期进行比较? –

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中。

+1

'date => DateTime.Now => date.AddMinutes(2)'should大概是'日期=> DateTime.Now> = date.AddMinutes(2)' – sloth

+0

@DominicKexel谢谢,输入到快速=) –

+0

@Mario哎,()方法需要一个日期时间传递到存储过程的spDeleteExpiredUsers,是否有循环遍历列表然后每次都通过该方法的方法? –