Stringbuilder和DataAdapter.Update重复行

时间:2014-07-25 12:15:26

标签: c# stringbuilder

我有一个类似于

的DataTable
Col1 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,但它不会删除我删除的任何行。使用ClearFill的组合来获取更新的表,而无需重新创建连接。

2 个答案:

答案 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.AddWithKeyupdateDataSet()的存在会导致较差的性能。事实上,在这种情况下,加载方法应该检查每一行都有重复的信息。

答案 1 :(得分:0)

请输入您的所有代码进行分析。 此外,在提供的代码中存在逻辑/设计问题。 PrintTable方法只能读取和打印数据。 UpdateDataset打破了代码意图。