使用ado访问sqlserver,访问部分代码如下
(strOpenSrc,strOpenDst为CString类型,pSrcConn,pDstConn为_ConnectionPtr类型,pSrcRs,pDstRs为_RecordsetPtr类型,sql server名称为wdk23411,对应的源数据表为master库中的wdk23411表,目标数据表为wdk23411库中的test1表。编译运行总是捕获异常,提示“BOF或EOF有一个是"真",或者当前的记录已被删除,所需的操作要求当前的一个记录” 仔细看了看没有什么逻辑上的错误,为什么总是得不到正确的结果,BTW:这段程序的目的是把一个数据表中的数据导入到另一个数据表中,运行后发现源数据表的最后一条记录已经加入到目标数据表中,但随后捕获异常,为什么是最后一条加进去了啊???)
::CoInitialize(NULL);
strOpenSrc="Provider=SQLOLEDB; Server=wdk23411;Database=master; uid=sa; pwd=;"; 
strOpenDst="Provider=SQLOLEDB; Server=wdk23411;Database=wdk23411; uid=sa; pwd=;";
try {pSrcConn->Open(_bstr_t(strOpenSrc),"","",NULL);}
catch (_com_error &e)
{
MessageBox(e.Description());
pSrcConn->Close();
pSrcConn->Open(_bstr_t(strOpenSrc),"","",NULL);
}
try {pDstConn->Open(_bstr_t(strOpenDst),"","",NULL);}
catch (_com_error &e)
{
MessageBox(e.Description());
pDstConn->Close();
pDstConn->Open(_bstr_t(strOpenDst),"","",NULL);
}
// Open Recordset
int iNum,iScore;
CString sName;
try
{
pSrcRs->Open(_variant_t("select * from wdk23411 where 1=1 order by num"),
 _variant_t((IDispatch*)pSrcConn,true),
 adOpenKeyset,
 adLockPessimistic,
 adCmdText);
pSrcRs->MoveFirst();
pDstRs->Open(_variant_t("select * from test1"),
 _variant_t((IDispatch*)pDstConn,true),
 adOpenKeyset,
 adLockPessimistic,
 adCmdText);
while(pSrcRs->EndOfFile==VARIANT_FALSE)
{
iNum=(int)(short)(pSrcRs->Fields->GetItem(_variant_t("num"))->Value);
sName=(char*)(_bstr_t)(pSrcRs->Fields->GetItem(_variant_t("name"))->Value);
iScore=(int)(short)(pSrcRs->Fields->GetItem(_variant_t("score"))->Value);
pDstRs->MoveFirst();
while (pDstRs->EndOfFile==VARIANT_FALSE)
{
int iTempNum=(int)(short)(pDstRs->Fields->GetItem(_variant_t("num"))->Value);
if (iTempNum==iNum)
{
MessageBox("不允许重复插入记录!","Warning",MB_OK|MB_ICONWARNING);
OnOK();
return;
}
else
{
pDstRs->MoveNext();
}
}
pSrcRs->MoveNext();
}
strCommand.Format("INSERT INTO test1 VALUES( %d,\'%s\',%f)",
  iNum,
  sName,
  (float)iScore);
pDstConn->Execute(_bstr_t(strCommand),NULL,adCmdText);
pSrcRs->MoveNext();
}
catch(_com_error &e)
{
MessageBox(e.Description());//这个地方总是捕获异常
}
pSrcRs->Release();
pSrcRs->Close();
pDstRs->Release();
pDstRs->Close();
pSrcConn->Close();
pDstRs->Close();
::CoUninitialize();

解决方案 »

  1.   

    在打开数据库前,添加如下语句试一下
    pRecordSet->CursorLocation = adUseClient;
      

  2.   

    其实你可以直接用一个select * into table from ...完成你的要求
      

  3.   

    这个问题你可以多在try语句里加几个断点,然后用F5单步运行,到了断点的地方按F11执行,就很容易找到是什么地方的问题了。
      

  4.   

    set->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pconn,true),adOpenStatic,adLockOptimistic,adCmdText);
    //试试改一下其中的两个参数adOpenKeyset, adLockPessimistic