Datatable.Load不会删除已删除的行

时间:2017-08-10 13:19:12

标签: c# sql-server winforms datatable sqldatareader

将数据从SQL Server数据库读取到Datatable时,我遇到了问题。我使用Datatable作为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();
}

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

这不是。这样就可以了。 来自MSDN

  

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

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

  

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

所以你的代码:

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

可以看起来像:

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