1

テーブル 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) セクションでは、1 つのバージョンを残し、他のすべてのバージョンを削除しようとしています。残念ながら、それは機能しません。つまり、すべてのエントリが削除されますが、何らかの理由でエラーが発生するエントリが削除されます。何を変更しますか、または一般的によりエレガントな方法はありますか?

4

1 に答える 1

0

重複を見つけるには、次の 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 を削除します)。

于 2012-06-19T13:22:37.093 に答える