【发布时间】: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/…