通过数据库表连续循环直到找到记录,然后删除记录。

时间:2013-06-01 02:44:08

标签: c# winforms sql-server-2008

我有这种方法必须扫描数据库表连续发布直到出现新记录它将它与另一个表中的记录进行比较并且如果它匹配它从表宣布删除它并继续搜索直到出现其他记录。是否有更好的方法来执行此操作而不是使用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
        }

    }

3 个答案:

答案 0 :(得分:2)

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

或者,如果找到匹配的记录,您可以在数据库级别对此表使用insert triger来处理删除记录。

通过C#代码,您可以使用CLR Triggers执行此操作。检查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();
}

答案 1 :(得分:0)

你到底想要做什么?如果您接受宣布中的值并删除它们(如果它们已经存在)那么触发器就可以了。但是,您也可以编写查询或视图,只选择存在或不存在匹配行的行。这两种方式都意味着你根本不必经常监视表格。

另一种方法是考虑使用依赖

http://msdn.microsoft.com/en-us/library/62xk7953.aspx

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

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

而不是不断的扫描过程。您可以在新消息到达时执行逻辑。

我认为从目前为止你所写的内容中,依赖性最适合你。

答案 2 :(得分:0)

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

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