连续循环遍历数据库表,直到找到记录,然后删除记录
本文关键字:记录 循环 然后 删除 遍历 连续 数据库 | 更新日期: 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