使用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();
(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();
pRecordSet->CursorLocation = adUseClient;
//试试改一下其中的两个参数adOpenKeyset, adLockPessimistic