【问题标题】:Removing duplicates in a MS Access database删除 MS Access 数据库中的重复项
【发布时间】:2012-06-19 13:12:11
【问题描述】:

我试图从表 Main 中删除重复项。

看起来像这样(这里是 csv 格式):

"Record ID";Status;Placement;Private;Category;Note;Blob

例如

14341692;132;2147483647;False;4;"29.12.10 14:17";System.Byte[]

重复的意思是,注是一样的。我的做法是这样的:

string strSQL = "SELECT * FROM Main";
OleDbCommand cmd = new OleDbCommand(strSQL, MemoVerbindung);
OleDbDataReader dr = cmd.ExecuteReader();
_items = new List<string>(); // <-- Add this
while (dr.Read())
{
    if (dr.FieldCount >= 5)
        _items.Add(dr[5].ToString());
}
dr.Close();
progressBar1.Maximum = _items.Count;
for (int a = 0; a < _items.Count; a++)
{
    progressBar1.Value = a;
    strSQL = "SELECT * FROM Main WHERE Note = '" + _items[a].ToString().Replace("'", "\'") + "'";

    cmd = new OleDbCommand(strSQL, MemoVerbindung);
    dr = null;
    OleDbDataReader dr2 = null;
    try
    {
        dr = cmd.ExecuteReader();
        int u = 0;
        if (dr.FieldCount > 1)
        {
            while (dr.Read())
            {
                if (u >= 1)
                {
                    string was = "DELETE FROM Main WHERE [Record ID] = " + dr[0];
                    OleDbCommand command = new OleDbCommand(was, MemoVerbindung);

                    OleDbDataReader reader = command.ExecuteReader();

                    while (reader.Read())
                    {
                        //MessageBox.Show(reader[0].ToString());
                    }
                    reader.Close();
                }
                u++;
            }
        }
        else
        {
            while (dr.Read())
            {
                MessageBox.Show("Übrig");
            }
        }

        dr.Close();
    }
    catch (Exception mm)
    {
        //MessageBox.Show(mm.Message);
    }
}
MessageBox.Show("Fertig");
progressBar1.Value = 0;

因此,在 if (u >= 1) 部分中,我试图保留一个版本,同时删除所有其他版本。不幸的是,这不起作用意味着所有条目都被删除,但由于某种原因引发错误的条目。你会改变什么或者有一个更优雅的方式?

【问题讨论】:

  • 为什么首先在数据库中有重复项?
  • 不,你可以。如果有错误,现在你正在修复它们——那很好。但是,如果您的应用程序正在创建重复项,然后您试图摆脱它们 - 那是错误的。你为什么编辑你的评论?我喜欢讽刺:)
  • 不,你可以。我的应用没有产生这些错误。
  • 记录是否完​​全重复,或者您是否还应该选择保存哪些记录以及删除哪些记录?而且您实际上是在通过注释列确定两行是否重复,对吗?不是靠PK。
  • 这里是一个示例查询:stackoverflow.com/questions/9912668/…

标签: c# .net ms-access


【解决方案1】:

使用此 SQL 语句查找重复项:

SELECT First(Main.[Note]) AS [NoteField], Count(Main.[Note]) AS NumberOfDups
FROM Main
GROUP BY Main.[Note]
HAVING (((Count(Main.[Note]))>1));

然后您可以遍历此记录集(将其作为快照获取,因此对基础数据的更改不会改变结果)
使用!NoteField 知道要查找哪个便笺,使用!NumberOfDups 知道您要删除多少(删除这个数字 - 1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-16
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 2022-01-10
    相关资源
    最近更新 更多