如何在不从数据库中删除 DataRow 的情况下将其从集合中排除?
How to exclude a DataRow from it's collection without Deleting it from the database?
有没有一种方法可以从它的 DataRowCollection 中删除一个 DataRow 而不 从数据库中删除它?
我正在编写一个监视网站的程序。它使用使用 Select * From MonitorSamples Where 1=0
创建的 DataAdapter 中的 DataTable 来获取其中没有实际行的 DataRowCollection。 table 相当大,监视器不需要旧样本,所以为了简单和效率,我只处理 getting/keeping 它正在处理的行。 (此外,不 删除这些数据行在技术上是内存泄漏,因为它们会随着时间的推移定期累积,直到程序重新启动或内存不足。)
由于它定期运行,它从网站收集数据并创建新记录 (Datatable.NewRow()
),然后将其添加到 DataTable 的 DatarowCollection (DataTable.Add()
),后者将被插入到调用 Dataset.Update
时的数据库。在以后的时间里,这些相同的数据行也将被修改并更新回数据库。
再后来,监视器知道不会再对特定记录进行更新,所以我想将它们从 DataRowCollection 中删除,但,而不是从数据库中删除.我不想删除它们,只是为了提高效率,我不想让它们再出现在数据集中。如果我不删除它们,DataRowCollection 将充满数千个这些不必要的已完成行,远远超过仍在更新的活动行。
显然 .Delete() 方法在 .AcceptChanges()
或 .Update()
之后将其从数据库中删除。不幸的是,尽管 Internet 上有许多相反的说法,但 .Remove() 方法也只是立即执行。来自 MS Doc:
Calling Remove is the same as calling Delete and then calling AcceptChanges.
此外,我不想只重新填充数据集,因为由于各种原因它会非常复杂,包括监视器仍在定期更新的那些尚未完成的行。
好吧,一时兴起,因为网上很多帖子都说DataRowsCollection.Remove(DataRow)
有效,所以我试了一下。它奏效了。(!!)
所以要么文档有误,要么我误解了这里的内容。我会接受第一个可以告诉我这里真实故事是什么的答案。
调用 DataAdapter.Update 后数据库才会更新。我认为对一行执行 Delete,然后立即对该行调用 AcceptChanges,将从 DataSet 的 diffgram 中删除该行的所有痕迹,以便稍后调用 if/when DataAdapter.Update,不会做任何事情数据库中的那一行。
为了帮助理解,您可以尝试调用:
YourDataSet.WriteXml("c:\somefile.xml", XmlWriteMode.DiffGram)
在您的 Remove 调用之后。
然后查看生成的文件。 Removed 行不应有 <diffgr:before>
条目。
有关差异图的背景信息:
https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/dataset-datatable-dataview/diffgrams
来自link:
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.
有没有一种方法可以从它的 DataRowCollection 中删除一个 DataRow 而不 从数据库中删除它?
我正在编写一个监视网站的程序。它使用使用 Select * From MonitorSamples Where 1=0
创建的 DataAdapter 中的 DataTable 来获取其中没有实际行的 DataRowCollection。 table 相当大,监视器不需要旧样本,所以为了简单和效率,我只处理 getting/keeping 它正在处理的行。 (此外,不 删除这些数据行在技术上是内存泄漏,因为它们会随着时间的推移定期累积,直到程序重新启动或内存不足。)
由于它定期运行,它从网站收集数据并创建新记录 (Datatable.NewRow()
),然后将其添加到 DataTable 的 DatarowCollection (DataTable.Add()
),后者将被插入到调用 Dataset.Update
时的数据库。在以后的时间里,这些相同的数据行也将被修改并更新回数据库。
再后来,监视器知道不会再对特定记录进行更新,所以我想将它们从 DataRowCollection 中删除,但,而不是从数据库中删除.我不想删除它们,只是为了提高效率,我不想让它们再出现在数据集中。如果我不删除它们,DataRowCollection 将充满数千个这些不必要的已完成行,远远超过仍在更新的活动行。
显然 .Delete() 方法在 .AcceptChanges()
或 .Update()
之后将其从数据库中删除。不幸的是,尽管 Internet 上有许多相反的说法,但 .Remove() 方法也只是立即执行。来自 MS Doc:
Calling Remove is the same as calling Delete and then calling AcceptChanges.
此外,我不想只重新填充数据集,因为由于各种原因它会非常复杂,包括监视器仍在定期更新的那些尚未完成的行。
好吧,一时兴起,因为网上很多帖子都说DataRowsCollection.Remove(DataRow)
有效,所以我试了一下。它奏效了。(!!)
所以要么文档有误,要么我误解了这里的内容。我会接受第一个可以告诉我这里真实故事是什么的答案。
调用 DataAdapter.Update 后数据库才会更新。我认为对一行执行 Delete,然后立即对该行调用 AcceptChanges,将从 DataSet 的 diffgram 中删除该行的所有痕迹,以便稍后调用 if/when DataAdapter.Update,不会做任何事情数据库中的那一行。
为了帮助理解,您可以尝试调用:
YourDataSet.WriteXml("c:\somefile.xml", XmlWriteMode.DiffGram)
在您的 Remove 调用之后。
然后查看生成的文件。 Removed 行不应有 <diffgr:before>
条目。
有关差异图的背景信息: https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/dataset-datatable-dataview/diffgrams
来自link:
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.