我有一个类似于
的DataTableCol1 Col2 Col3 Col4 Col5 Date
21 22 23 24 25 7/25/2014 12:00:00 AM
31 32 33 34 35 7/25/2014 12:00:00 AM
11 12 13 14 15 7/25/2014 12:00:00 AM
我将其作为
循环播放StringBuilder output = new StringBuilder("Col1\tCol2\tCol3\tCol4\tCol5\tDate\n");
foreach(DataRow row in partTable.Select()) {
output.AppendLine(String.Join("\t", row.ItemArray.ToArray()));
}
并在输出中使用StringBuilder.Replace
进行一些格式化。我将结果打印到MessageBox
并复制我的行。我第一次打电话给它打印2份,然后打印3份,等等。(After one call.)我反复检查表是否正确,并且不包含重复项。以下是此功能的完整代码。
private void printTable() {
updateDataSet();
if (partTable.Rows.Count == 0) {
MessageBox.Show("Table is empty.", "Table");
return;
}
StringBuilder output = new StringBuilder("Col1\tCol2\tCol3\tCol4\tCol5\tDate\n");
foreach(DataRow row in partTable.Select()) {
output.AppendLine(String.Join("\t", row.ItemArray.ToArray()));
}
// Get rid of time and type
output.Replace("12:00:00 AM", "");
output.Replace("W\t", "");
MessageBox.Show(output.ToString(), "Table");
output.Clear();
}
已实施的解决方案:注释掉updateDataSet()会删除重复项。我想我只需要更仔细地阅读MSDN ...用Fill
替换Update
,但它不会删除我删除的任何行。使用Clear
和Fill
的组合来获取更新的表,而无需重新创建连接。
答案 0 :(得分:1)
如果您使用DataAdapter.Fill(DataTable)
方法调用两次,则会使数据表中的记录加倍。要避免此行为,您需要编写(在updateDataSet()方法内部)
OleDbDataAdapter da = new OleDbDataAdapter(.....)
DataTable dt = new DataTable();
da.MissingSchemaAction = MissingSchemaAction.AddWithKey;
da.Fill(dt);
// Just for testing
// Check these results with and without the MissingSchemaAction flag
Console.WriteLine(dt.Rows.Count);
da.Fill(dt);
Console.WriteLine(dt.Rows.Count);
当然,如果你没有将第二次(或第三次调用)的原因移除到MissingSchemaAction.AddWithKey
,updateDataSet()
的存在会导致较差的性能。事实上,在这种情况下,加载方法应该检查每一行都有重复的信息。
答案 1 :(得分:0)
请输入您的所有代码进行分析。 此外,在提供的代码中存在逻辑/设计问题。 PrintTable方法只能读取和打印数据。 UpdateDataset打破了代码意图。