我的这段代码错在哪儿吗?请高手指教!!

EdisonWu 2003-05-15 10:39:37
我想删除掉数据库表中重复的纪录:期望程序运行时点击菜单中“删除重复纪录”时,能够完成删除的操作。具体是先建立一个空的纪录集,然后表中的项跟纪录集中的项比较,如果在纪录集中能找到相同的项,则删除表中的对应项,否则将该项添加到纪录集中。
代码没有语法错误,但点击“删除重复纪录”时,显示出了系统错误,自动关闭了文件框。我不知道错在什么地方,请哪位高手帮忙看看,谢谢!!

void CMainFrame::OnDelAdd()
{
::CoInitialize(NULL);
_ConnectionPtr pConn;
pConn.CreateInstance(__uuidof(Connection));
try
{
pConn->Open("Provider=Microsoft.Jet.OLEDB.4.0; Data Source =d:\\database.mdb;","","",-1);
}
catch(_com_error e)
{
AfxMessageBox("fail to connect the database!");
}
_RecordsetPtr MySet;
CString MyTemp,StrLeft,StrRight;
_variant_t Left,Right;
CStringArray ArrayLeft,ArrayRight;
int iNum;

MySet.CreateInstance(__uuidof(Recordset));
MyTemp="SELECT * FROM table1";
MySet->Open(_variant_t(MyTemp), pConn.GetInterfacePtr(),adOpenDynamic, adLockOptimistic, adCmdText);

if(!MySet->BOF)
{
MySet->MoveFirst();
Left=MySet->GetCollect(_variant_t("IndexLeft"));
Left.ChangeType(VT_BSTR);
StrLeft=Left.bstrVal;
Right=MySet->GetCollect(_variant_t("IndexRight"));
Right.ChangeType(VT_BSTR);
StrRight=Right.bstrVal;
ArrayLeft.SetAt(0,*StrLeft);
ArrayRight.SetAt(0,*StrRight);
iNum=1;
MySet->MoveNext();
while(!MySet->EndOfFile)
{
int i,sign;
Left=MySet->GetCollect(_variant_t("IndexLeft"));
Left.ChangeType(VT_BSTR);
StrLeft=Left.bstrVal;
Right=MySet->GetCollect(_variant_t("IndexRight"));
Right.ChangeType(VT_BSTR);
StrRight=Right.bstrVal;
for(i=0;i<iNum;i++)
{
sign=0;
if((StrLeft==ArrayLeft.GetAt(i))&& (StrRight==ArrayRight.GetAt(i)))
{
sign=1;
break;
}
}
if(sign==0)
{
ArrayLeft.SetAt(iNum,StrLeft);
ArrayRight.SetAt(iNum,StrRight);
iNum++;
}
else
{
MySet->Delete(adAffectCurrent);
}
MySet->MoveNext();
}
}
else
AfxMessageBox("The table1 is empty!");
MySet->Close();
pConn->Close();
// TODO: Add your command handler code here
}
...全文
20 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lizmei001 2003-05-16
  • 打赏
  • 举报
回复
没怎么看明白
你可以检查一下你的数据库中的字段是不是有为NULL值的
在 CString str = (variant_t)b时最好判断是不是ISNULL
最差也得用TRY()CATCH()来捉
CString str("NULL")会出错的
还有就是你的算法的效率也太低了点吧,要是有几万或几十万条,你得等上大半天了

建议用Select *from table order by LEFT ;
然后对LEFT进行比较,再对RIGHT进行比较,会快很多的
丁淇石头 2003-05-16
  • 打赏
  • 举报
回复
晕!!!!这段程序我一时半会看不明白。你自己先跟踪一下,看看是那一句出错。
flyingjust 2003-05-16
  • 打赏
  • 举报
回复
呵呵 你跟一下看那一句出错:)

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧