0

我有这种方法,它必须连续扫描数据库表 Announce,直到出现新记录,它将它与另一个表中的记录进行比较,如果匹配,则从表中删除它Announce 并继续搜索,直到出现另一个记录。有没有更好的方法来代替使用 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
        }

    }
4

3 回答 3

2

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

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

通过 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();
}
于 2013-06-01T03:34:02.780 回答
0

你到底想在这里做什么?如果您在通告中接受值并在它们已经存在的情况下将其删除,那么触发器就可以了。但是,您也可以编写查询或视图来仅选择存在或不存在匹配行的行。这两种方式都意味着您实际上根本不必经常监视表。

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

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

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

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

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

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

于 2013-06-01T05:22:10.697 回答
0

// 您可以在 T-Sql 的删除语句中使用内连接:

DELETE FROM tbl1
FROM table1 AS tbl1
INNER JOIN table2 AS tbl2 ON tbl1.Id=tble2.Id 
于 2013-06-01T09:08:17.083 回答