我有一个SQL数据库,它是一个“馈送器”表。我将记录放在所述表中,第三方包使用(并删除)它们。所有hunky dory - 直到第三方包没有运行。在考虑如何检测时,我心想......“好吧......如果我读了表中的所有键(它不是很大 - 最多几十条记录),然后保留它们,然后在5分钟内,我检查是否仍然在桌子上?“
这可能不是一个出色的解决方案,但是它让我不再考虑Linq以及你是否可以做这样的事情(我之前没有使用过Linq)。
因此,如果我将所有记录键读入DataTable对象,然后,五分钟后,将所有记录读入另一个DataTable对象,我可以进行Linq选择,连接键列上的两个DataTable对象,以及然后查看“计数”的结果,如果有一个或多个,则表中的数据可能没有被消耗。
或者......是否有一种“聪明”的方式?
答案 0 :(得分:0)
创建一个DELETE触发器,在单独的表中记录上次删除的时间戳。另外一个INSERT触发器将记录最后一个insert语句的时间戳。
比较两个时间戳。
答案 1 :(得分:0)
您可以在插入后返回标识列值(假设有一个),并将其与其提交日期时间一起记录在一个单独的表中,它们只是将未完成的记录拉出来;
SELECT * FROM feeder_table F
INNER JOIN other_table T ON (F.id = T.id)
WHERE DATEDIFF(MINUTE, T.commitdate, GETDATE()) > 5
这样你的内存数据就不会持续存在,因此它可以在应用程序重启/跨机器之间工作。
(如果这仅用于故障检测,您只需要存储最后插入的ID。)
答案 2 :(得分:0)
这是一种方式:
DataTable t1 = GetData(); // returns a datatable with an Int16 "Id" column
// time passes... a shabby man enters and steals your lamp
DataTable t2 = GetData();
// some data changes have occurred
t2.Rows.Add(null, DateTime.Now.AddSeconds(10), "Some more");
t2.Rows[1].Delete();
EnumerableRowCollection<DataRow> rows1 = t1.AsEnumerable();
EnumerableRowCollection<DataRow> rows2 = t2.AsEnumerable();
var keys1 = rows1.Select(row => (Int16)row["Id"]).ToList();
var keys2 = rows2.Select(row => (Int16)row["Id"]).ToList();
// how many keys from t1 are still in t2
Console.WriteLine("{0} rows still there", keys1.Count(id => keys2.Contains(id)));
答案 3 :(得分:0)
但这更像我的想法:
DataTable t1 = GetData(); // returns a datatable with an Int16 "Id" column
// time passes... your lamp is getting dim
DataTable t2 = GetData();
// some data changes have occurred
t2.Rows.Add(null, DateTime.Now.AddSeconds(10), "Some more");
t2.Rows[1].Delete();
EnumerableRowCollection<DataRow> rows1 = t1.AsEnumerable();
EnumerableRowCollection<DataRow> rows2 = t2.AsEnumerable();
// how many rows from r1 are still in r2
int n = (from r1 in rows1
join r2 in rows2 on (Int16)r1["Id"] equals (Int16)r2["Id"]
select r1).Count();
...这是我在原始问题中提到的“linq / join”方法。