C# 按日期删除数据库中的数据

C# 按日期删除数据库中的数据,c#,database,winforms,C#,Database,Winforms,我已经做了一个简单的程序,这个程序将添加数据库中的数据,提交时间,以及过期时间(即提交后添加2天)。但是,当数据库中的数据已经存在,并且我将计算机中的日期更改为过期时间,然后当我运行程序时,数据库中本应删除的数据不会被删除 而且,即使我们没有运行程序,也会执行间隔为1000(1秒)的计时器吗 基本上,我希望在达到过期时间时自动删除数据库中的数据。例如:数据库中有一个过期日期和时间为2015年1月31日的数据,当到达该过期日期和时间时,该数据将自动从数据库中删除 以下是我正在使用的代码: publ

我已经做了一个简单的程序,这个程序将添加数据库中的数据,提交时间,以及过期时间(即提交后添加2天)。但是,当数据库中的数据已经存在,并且我将计算机中的日期更改为过期时间,然后当我运行程序时,数据库中本应删除的数据不会被删除

而且,即使我们没有运行程序,也会执行间隔为
1000
(1秒)的
计时器吗

基本上,我希望在达到过期时间时自动删除数据库中的数据。例如:数据库中有一个过期日期和时间为2015年1月31日的数据,当到达该过期日期和时间时,该数据将自动从数据库中删除

以下是我正在使用的代码:

public partial class Form1 : Form
{
    public string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=../db1.accdb; Persist Security Info=False;";

    Timer _timer = new Timer();

    public Form1()
    {
        InitializeComponent();

        _timer.Interval = 1000;

        _timer.Tick += delegate
        {
            RealTimeTimer();
        };
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        _timer.Start();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Add();

        this.label2.Text = this.textBox1.Text;

        this.label3.Text = Convert.ToString(UserInformation.Submitted);

        this.label4.Text = Convert.ToString(UserInformation.Expired);
    }

    private void RealTimeTimer()
    {
        UserInformation.Submitted = DateTime.Now;

        if (DateTime.Now >= DateTime.Now.AddDays(2))
        {
            Delete();
        }
    }

    private void Add()
    {
        try
        {
            using (OleDbConnection conn = new OleDbConnection(connectionString))
            {
                string query = "INSERT INTO [Data] ([Description], [SubmittedOn], [ExpiredOn]) VALUES (@Description, @SubmittedOn, @ExpiredOn)";

                conn.Open();

                using (OleDbCommand command = new OleDbCommand(query, conn))
                {
                    UserInformation.Expired = DateTime.Now.AddDays(2);

                    command.Parameters.Add("@Description", OleDbType.VarChar);
                    command.Parameters["@Description"].Value = this.textBox1.Text;

                    command.Parameters.Add("@SubmittedOn", OleDbType.VarChar);
                    command.Parameters["@SubmittedOn"].Value = Convert.ToString(UserInformation.Submitted);

                    command.Parameters.Add("@ExpiredOn", OleDbType.VarChar);
                    command.Parameters["@ExpiredOn"].Value = Convert.ToString(UserInformation.Expired);

                    command.ExecuteNonQuery();
                }

                conn.Close();
            }
        }

        catch(Exception ex)
        {
            MessageBox.Show("There is an exception: " + ex.Message, "Warning", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

    private void Delete()
    {
        try
        {
            using (OleDbConnection conn = new OleDbConnection(connectionString))
            {
                string query = "DELETE FROM [Data] WHERE [ExpiredOn] = @ExpiredOn";

                conn.Open();

                using (OleDbCommand command = new OleDbCommand(query, conn))
                {
                    command.Parameters.Add("@ExpiredOn", OleDbType.VarChar);
                    command.Parameters["@ExpiredOn"].Value = Convert.ToString(UserInformation.Expired);

                    command.ExecuteNonQuery();
                }

                conn.Close();
            }
        }

        catch (Exception ex)
        {
            MessageBox.Show("There is an exception: " + ex.Message, "Warning", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
}

class UserInformation
    {
        public static DateTime Submitted
        {
            get;
            set;
        }

        public static DateTime Expired
        {
            get;
            set;
        }
谢谢大家对这个问题感兴趣

非常感谢你的回答

非常感谢你

其中[ExpiredOn]=@ExpiredOn

你知道这只有在两个日期完全匹配时才是真的,对吗?而这个查询在正确的时间运行的可能性是惊人的不可能发生的,对吗

试试这个:

    private void Delete()
    {
        try
        {
            using (OleDbConnection conn = new OleDbConnection(connectionString))
            {
                string query = "DELETE FROM [Data] WHERE [ExpiredOn] <= @ExpiredOn";

                conn.Open();

                using (OleDbCommand command = new OleDbCommand(query, conn))
                {
                    command.Parameters.AddWithValue("@ExpiredOn", UserInformation.Expired);
                    command.ExecuteNonQuery();
                }

                conn.Close();
            }
        }

        catch (Exception ex)
        {
            MessageBox.Show("There is an exception: " + ex.Message, "Warning", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
private void Delete()
{
尝试
{
使用(OLEDB连接连接=新OLEDB连接(连接字符串))
{
string query=“从[Data]中删除,其中[ExpiredOn]看看这个:

if (DateTime.Now >= DateTime.Now.AddDays(2))
    {
        //  :-(  I Will never be called...
    }
它在您的timer_tick方法上,不会被调用。 DateTime.Now如何在..之后大于两天

;
让我给你一个简单的方法来完成你的工作。也就是说,删除恰好在两天前提交的记录。你所需要做的就是让计时器运行

public Form1()
{
    InitializeComponent();
    _timer.Interval = 1000;
    _timer.Tick += delegate
    {
        RealTimeTimer();
    };
}

private void Delete()
{
使用(OLEDB连接连接=新OLEDB连接(连接字符串))
{

string query=“DELETE FROM[Data]其中DateAdd('d',2,[SubmittedOn])看起来像计时器(或其他东西)应该超过新的截止日期;日期比较应该>=以删除所有旧的,而不仅仅是那些恰好匹配的,并且如果要进行日期比较,请使用日期列而不是varchar/string/text。字符串不会像日期那样进行比较do@Plutonix只要数据库中的列的类型为
date
datetime
datetime2
将参数设置为字符串是没有问题的。事实上,最好始终使用字符串,以避免由于时区等原因而进行转换。但是关于
=
而不是
=
,您是对的。保存的“日期”数据似乎不是日期类型,而是字符串(请参见插入)。“09/01/2000”将始终评估大于“12/31/2016”因为文本比较不适用于日期。有许多问题需要解决debugged@Plutonix:我在数据库中使用了
DateTime
数据类型,工作正常。感谢您添加此项,当我按日期删除时,我返回到前一天的11:59:59,同时删除到结束日期。是的,它工作正常。感谢您的帮助在@Will.但是,有没有办法让它像实时一样?因为数据库中的数据不会被删除,即使该日期与数据库中的过期日期相同(只有在程序运行时才会被删除)。我只是用以下内容替换delete参数:
command.Parameters[“@ExpiredOn”].Value=UserInformation.Submitted;
当我使用
=
时,但是当我使用
@云南实时时?不是没有在sql数据库服务器中设置一些东西。但是,它是实时的要求是什么?还是没有?我怀疑没有,而且无论何时只要你着手删除它都会很好很好。嗯,那好吧@Will。我只是想玩一下这个游戏,用date自动删除数据库中的数据。不过没有具体的原因。谢谢你的回答。我很感激。是的,它很有效。谢谢你@Will。但是,有没有办法保持它像实时一样?因为数据库中的数据甚至没有被删除虽然日期与数据库中的过期日期相同(仅当程序运行时才会删除)。但我只是将删除参数替换为:
命令。参数[“@ExpiredOn”].Value=UserInformation.Submitted;
当我使用
=
时,但当我使用

 private void RealTimeTimer()
{
    Delete();
}
private void Delete()
{
    using (OleDbConnection conn = new OleDbConnection(connectionString))
    {
        string query = "DELETE FROM [Data] WHERE DateAdd('d', 2, [SubmittedOn]) <= Now";
        conn.Open();
        using (OleDbCommand command = new OleDbCommand(query, conn))
            command.ExecuteNonQuery();
        conn.Close();
    }
}