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