【问题标题】:Datatable.Load doesn't remove deleted rowsDatatable.Load 不会删除已删除的行
【发布时间】:2018-01-18 18:34:19
【问题描述】:

在将数据从 SQL Server 数据库读取到数据表时遇到问题。我使用数据表作为我的 DataGridView 的数据源,并使用以下代码填充 SQL Server 表中的数据表。此代码每 10 秒运行一次以保持结果更新,并且在修改或添加行时(从程序的另一个实例或直接从 ssms)运行良好,但当从数据库中删除行时,它们仍保留在数据表中。

例如,如果我最初使用以下查询加载表:

SELECT TOP 10 * 
FROM Table 

然后用

加载它
SELECT TOP 5 * 
FROM Table

数据表仍然有 10 行。

我尝试了每个LoadOptions(Upsert、OverwriteChanges 和 PreserveChanges)相同的结果。

我找到的唯一解决方案是在加载之前调用datatable.Rows.Clear(),但这会导致其他问题。

using (SqlConnection con = new SqlConnection(_connectionString))
using (SqlCommand command = new SqlCommand(query, con))
{
    con.Open();

    using (SqlDataReader reader=command.ExecuteReader())
    {
        dt.Load(reader);
    }

    con.Close();
}

我该如何解决这个问题?

【问题讨论】:

  • 你能新建一个DataTable吗? dt = new DataTable();
  • 我可以,但是我需要重置 datagridview 的数据源。好像不对。。如果可以的话我试试看。
  • 无论哪种方式,您都必须重置 datagridview 的数据源

标签: c# sql-server winforms datatable sqldatareader


【解决方案1】:

这不是问题。这以这种方式工作。 来自MSDN

使用提供的数据源的值填充 DataTable 数据读取器。如果 DataTable 已经包含行,则传入数据 来自数据源的数据与现有行合并。

您可以通过Restet方法创建新数据表或清除现有数据表。

将 DataTable 重置为其原始状态。重置删除所有数据, 表的索引、关系和列。如果 DataSet 包含一个 DataTable,该表仍将是该表之后的DataSet的一部分 已重置。

所以你的代码:

using (SqlDataReader reader=command.ExecuteReader())
{
    dt.Load(reader);
}

可能看起来像:

using (SqlDataReader reader=command.ExecuteReader())
{
    dt.Reset();
    dt.Load(reader);
}

【讨论】:

  • 我按照您的建议添加了 Reset(),即使应用程序在调试模式下运行,也会出现奇怪的消息框异常。消息说索引超出范围。可能是因为数据网格视图将数据表作为其数据源?
猜你喜欢
  • 1970-01-01
  • 2022-07-22
  • 1970-01-01
  • 2018-02-02
  • 2013-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多