2017-08-10 121 views
0

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

例如,如果我最初与以下查询装载表:

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(); 
} 

我该如何解决这个问题?

+0

您可以只需创建一个新的DataTable? dt = new DataTable(); – msmucker0527

+0

我可以但后来我需要重置datagridview的数据源。它似乎不正确..如果没关系,我会试试看。 –

+0

您将不得不重置datagridview的数据源 – msmucker0527

回答

0

这不是。这以这种方式工作。 从MSDN

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

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

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

所以,你的代码:

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

可以关注一下:

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

我按照您的建议添加了Reset(),并且即使应用程序以调试模式运行,也会出现奇怪的消息框异常。该消息称索引超出范围。可能是因为数据网格视图具有可数据表作为其数据源? –