如何从其集合中排除DataRow而不从数据库中删除它?

时间:2019-05-26 16:21:48

标签: .net ado.net

是否可以从DataRowCollection 中删除DataRow,而无需从数据库中删除它?

我正在编写一个监视网站的程序。它使用通过Select * From MonitorSamples Where 1=0创建的DataAdapter中的DataTable来获取其中没有实际行的DataRowCollection。该表很大,并且监视器不需要旧的样本,因此,出于简单性和效率的考虑,我仅获取/保留其正在处理的行。 (此外,从技术上讲, not 摆脱这些DataRows的原因是内存泄漏,因为它们会随着时间的推移定期积累,直到重新启动程序或内存不足为止。)

它定期运行时,会从网站上收集数据并创建新记录(Datatable.NewRow()),然后将其添加到DataTable的DatarowCollection(DataTable.Add())中,然后将其插入数据库中当Dataset.Update被调用时。以后,这些相同的DataRows也将被修改并更新回数据库。

稍后,监视器仍然知道特定记录将不再有更新,因此我想从DataRowCollection中删除它们,,而不是从数据库中删除。我不想删除它们,只是为了效率而不再希望它们在数据集中。如果我不删除它们,DataRowCollection将被成千上万的这些不必要的已完成行填充,远远超过仍在更新的活动行。

很明显, .Delete()方法在.AcceptChanges().Update()之后将其从数据库中删除。不幸的是,尽管互联网上有许多相反的说法, .Remove()方法也只能立即执行此操作。来自MS Doc

  

调用Remove与调用Delete,然后调用AcceptChanges相同。

此外,我不想仅重新填充数据集,因为由于各种原因,数据集将非常复杂,包括那些尚未完成的行以及Monitor仍在定期更新。


好吧,一时兴起,由于许多互联网帖子都声称DataRowsCollection.Remove(DataRow)有效,所以我尝试了一下。而且有效。(!!)

因此该文档是错误的,或者我在这里误解了一些东西。我将接受第一个答案,该答案可以告诉我这里的真实故事。

1 个答案:

答案 0 :(得分:1)

直到调用DataAdapter.Update才更新数据库。我认为对某行执行Delete操作,然后立即对该行进行调用AcceptChanges,将会从DataSet的diffgram中删除该行的所有痕迹,因此,如果稍后调用DataAdapter.Update,则不会对该行进行任何处理数据库。

为帮助理解,您可以尝试致电:

YourDataSet.WriteXml("c:\\somefile.xml", XmlWriteMode.DiffGram)

在您的删除呼叫后。 然后看看生成的文件。 “已删除”行不应有<diffgr:before>条目。

有关diffgrams的背景信息: https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/dataset-datatable-dataview/diffgrams

通过该链接:

Note that Deleted rows will have an Original row version in the <diffgr:before> block, but there will be no annotated element in the < DataInstance > block.