Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从sql数据库检索记录时出现While循环问题_C#_Sql_Sql Server - Fatal编程技术网

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

C# 从sql数据库检索记录时出现While循环问题,c#,sql,sql-server,C#,Sql,Sql Server,我已经试着让它工作了大约6个小时了,但似乎在我的代码中找不到解决方案或错误 基本上,代码应该拾取当前日期/时间后2分钟的日期/时间的每个实例,但出于某种原因,它只返回一个实例。我试过很多方法来解决这个问题,我不可能把它们都写下来 我有两种方法removedexpiredusers()和getexpiredusersdate() Getexpiredusersdate()应检索添加的每个记录日期/时间,并将它们传送到removeexpiredusers(),后者应使用该方法筛选出哪些记录比当前日期

我已经试着让它工作了大约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;
}
编辑

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

GetUsers

Create proc spGetUsers
as
Begin
    SELECT * 
    FROM [User]
    ORDER BY Username
End
Create proc spDeleteExpiredUsers
@DateAdded datetime
as
Begin
    DELETE 
    FROM [User] 
    WHERE DateAdded = @DateAdded
End
*spDeleteExpiredUsers

Create proc spGetUsers
as
Begin
    SELECT * 
    FROM [User]
    ORDER BY Username
End
Create proc spDeleteExpiredUsers
@DateAdded datetime
as
Begin
    DELETE 
    FROM [User] 
    WHERE DateAdded = @DateAdded
End
基本上,代码应该拾取当前日期/时间后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;
}
但是,正如christiandev所提到的,您也可以在SQL中完成所有这些

基本上,代码应该拾取当前日期/时间后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;
}

但是,您也可以像christiandev提到的那样在SQL中执行所有这些操作。

为什么不创建一个存储过程,根据您的逻辑删除用户呢

DELETE FROM UserTable WHERE DATEDIFF(day,getdate(),DateAdded) < -1
从用户表中删除,其中DATEDIFF(day,getdate(),DateAdded)<-1
然后,您可以从.NET应用程序中使用调用此存储过程(如果您希望影响行数),或者不需要任何结果

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


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

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

DELETE FROM UserTable WHERE DATEDIFF(day,getdate(),DateAdded) < -1
从用户表中删除,其中DATEDIFF(day,getdate(),DateAdded)<-1
然后,您可以从.NET应用程序中使用调用此存储过程(如果您希望影响行数),或者不需要任何结果

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



编辑:我已升级了SQL,这将删除1天前添加的所有用户。

您应该注释掉所有的
try catch
块,以便我们可以更好地调试。但是消息框显示所有用户还是仅显示一个用户?因为您只返回最后一个日期,并且在执行删除的if中只检查最后一个日期operation@Steve嗨,史蒂夫,它只显示了一个用户,是否有办法将其他日期输入?@Steve He返回一个日期,但他不是在删除详细信息,因此对于每个循环,他将获取一个但不同的值??如果messagebox只显示一个日期,而您希望找到多个用户,那么问题不在这里,而是在dal.GetUsers()中Call您应该注释掉所有的
try catch
块,这样我们可以更好地调试。但是messagebox显示所有用户还是仅显示一个?因为您只返回最后一个日期,并且在执行删除的if中只检查最后一个日期operation@Steve嗨,史蒂夫,它只显示了一个用户,是否有办法将其他日期输入?@Steve He返回一个日期,但他不是在删除详细信息,因此对于每个循环,他将获取一个但不同的值??如果messagebox只显示一个日期,而您希望找到多个用户,那么问题不在这里,而是在dal.GetUsers()中调用
date=>DateTime.Now=>date.AddMinutes(2)
可能应该是
date=>DateTime.Now>=date.AddMinutes(2)
@DominicKexel谢谢,键入到fast=)@Mario嘿,spDeleteExpiredUsers()方法需要一个DateTime来传递到存储过程,是否有一种方法可以循环浏览列表,然后每次都传递给该方法?@Mario谢谢Mario这是一个很好的答案
DateTime.Now=>date.AddMinutes(2)
应该是
date=>DateTime.Now>=date.AddMinutes(2)
@DominicKexel谢谢,键入fast=)@Mario嘿,spDeleteExpiredUsers()方法需要一个datetime来传递到存储过程,是否有一种方法可以在列表中循环,然后每次传递到该方法?@Mario谢谢Mario这是一个很好的答案您正在使用的RegisteredDate()函数是什么?这只是psuedo代码,应该是
DateAdd
(现在我又看了一遍代码)ChristianDev,这段代码会检索当前日期并将其与表中的日期进行比较吗?我已经为您编辑了SQL,因为这只是一个伪SQL。它将删除任何带有日期广告的人