C# 删除MS Access数据库中的重复项

C# 删除MS Access数据库中的重复项,c#,.net,ms-access,C#,.net,Ms Access,我试图从主表中删除重复项 看起来是这样的(这里是csv格式): 比如说 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.Execut

我试图从主表中删除重复项

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

比如说

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;
string strSQL=“从主菜单中选择*”;
OleDbCommand cmd=新的OleDbCommand(strSQL,memorverbinding);
OleDbDataReader dr=cmd.ExecuteReader();
_items=新列表();//=5)
_items.Add(dr[5].ToString());
}
Close博士();
progressBar1.Maximum=\u items.Count;
对于(int a=0;a<\u items.Count;a++)
{
progressBar1.值=a;
strSQL=“SELECT*FROM Main WHERE Note=”+\u items[a].ToString().Replace(“”,“\”)+“”;
cmd=新的OleDbCommand(strSQL,memorVerbindung);
dr=null;
OleDbDataReader dr2=null;
尝试
{
dr=cmd.ExecuteReader();
int u=0;
如果(dr.FieldCount>1)
{
while(dr.Read())
{
如果(u>=1)
{
string was=“从Main删除,其中[Record ID]=”+dr[0];
OleDbCommand命令=新的OleDbCommand(was,MemorVerbinding);
OleDbDataReader=command.ExecuteReader();
while(reader.Read())
{
//MessageBox.Show(读卡器[0].ToString());
}
reader.Close();
}
u++;
}
}
其他的
{
while(dr.Read())
{
MessageBox.Show(“Übrig”);
}
}
Close博士();
}
捕获(异常mm)
{
//MessageBox.Show(mm.Message);
}
}
MessageBox.Show(“Fertig”);
progressBar1.值=0;

因此,在if(u>=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)

为什么数据库中有重复项?不,可以。如果有错误,现在你正在修复它们-那很好。但是,如果应用程序正在创建重复项,然后试图消除它们,那就错了。你为什么要编辑你的评论?我喜欢讽刺:)不,你可以。我的应用程序没有产生这些错误。记录是否完全重复,或者您是否应该选择保存哪些记录并删除哪些记录?实际上,你是在通过note列判断两行是否是重复的,对吗?不是通过PK。下面是一个示例查询:
SELECT First(Main.[Note]) AS [NoteField], Count(Main.[Note]) AS NumberOfDups
FROM Main
GROUP BY Main.[Note]
HAVING (((Count(Main.[Note]))>1));