连续循环遍历数据库表,直到找到记录,然后删除记录

本文关键字:记录 循环 然后 删除 遍历 连续 数据库 | 更新日期: 2023-09-27 18:16:25

我有这个方法,必须连续扫描数据库表announcement,直到出现新记录,它将其与来自另一个表的记录进行比较,如果它匹配,则将其从表announcement中删除,并继续搜索,直到另一个记录出现。除了使用while(true)语句,是否有更好的方法来做到这一点?注意:我正在使用Sqlserver

 //Begin method
    public void Begin()
    {
        string announce;
        double announceID;
        try
        {
            using (SqlConnection connStr = new SqlConnection(ConfigurationManager.ConnectionStrings["AnnounceConnString"].ConnectionString))
            {
                while (true)
                {
                  //Selects Last record written to tblAnnounce 
                    SqlCommand sqlcommandStart = new SqlCommand("AnnounceSelect", connStr);
                    sqlcommandStart.CommandType = CommandType.StoredProcedure;
                    connStr.Open();
                    SqlDataReader dr = sqlcommandStart.ExecuteReader();
                    if (dr.HasRows)
                    {
                        while (dr.Read())
                        {
                            announce = dr["AnnounceID"].ToString();
                            announceID = Convert.ToDouble(announce);
                            //Compares Values
                            //if it matches then DELETE record from TblAnnounce
                        }
                        connStr.Close();
                    }
                    else 
                    {
                        connStr.Close();
                    }
                    dr.Close();
                }
            }
        }
        catch(Exception ex)
        {
            string exception = ex.Message;
            MessageBox.Show(exception
        }
    }

连续循环遍历数据库表,直到找到记录,然后删除记录

与其连续检查插入记录,不如在插入时轻松处理。在插入其他表之前检查,如果存在,则可以忽略插入。

或者您可以在数据库级别对该表使用插入触发器来处理删除记录,如果找到匹配的记录。

你可以使用CLR触发器来实现。查看MSDN页面末尾的示例。

编辑

根据你的新评论,你不是插入数据,但你想比较和删除记录。您可以按如下操作。根据需要更改SQL查询

using (var sc = new SqlConnection(ConnectionString))
using (var cmd = sc.CreateCommand())
{
    sc.Open();
    cmd.CommandText = "delete from TableB where OtherID in (select distinct ID from tableA)";
    cmd.ExecuteNonQuery();
}

你到底想做什么?如果您接受声明中的值,并删除已经存在的值,则可以使用触发器。但是,您也可以编写查询或视图来只选择存在或不存在匹配行的行。这两种方法都意味着您实际上根本不需要一直监视表。

另一种方法是考虑使用依赖项 http://msdn.microsoft.com/en-us/library/62xk7953.aspx

或者,根据您的情况,将消息放入公告表的队列可能是更好的模型。

http://msdn.microsoft.com/en-us/library/ms345108 (v = sql.90) . aspx

而不是一个不断扫描的过程。您可以在新消息到达时进行逻辑处理。

从你目前写的内容来看,我认为依赖项是最适合你的。

//你可以在T-Sql的delete语句中使用内部连接:

DELETE FROM tbl1
FROM table1 AS tbl1
INNER JOIN table2 AS tbl2 ON tbl1.Id=tble2.Id