小弟我用MFC ODBC连接数据库时,提示非法的游标位置:未定义键值;求解

我用MFC ODBC连接数据库时,提示非法的游标位置:未定义键值;求解
我连接的事一个excel表,我想删除里边的条目
代码如下
CDatabase* pDB = theApp.GetDBConnect();
CRecordset recset(pDB);
CString strSQL = "SELECT * FROM [" + m_strTablename + "$] WHERE 序号='"+str+"'";
recset.Open(CRecordset::forwardOnly, strSQL);
//recset.MoveFirst();
recset.Delete();//运行到此处时,提示如题目的错误
if(recset.IsEOF())  

recset.MoveLast();
  else  
recset.MoveNext();  
recset.Close();

------解决方案--------------------
没有获取到你所要删除的记录,可以参照以下以下代码:
iPos2 = m_goodsinflist.GetFirstSelectedItemPosition(); //函数执行成功,则返回条目的POSITION值,
//如果返回值为KULL,则表示当前列表视图控件中没有条目选中。
nItem2 = m_goodsinflist.GetNextSelectedItem(iPos2); //如果函数执行成功,则返回列表视图控件中
//下一 个被选中的条目索引。其中参数pos为将接收条目POSITION值的变量。
number = nItem2;
if(number < 0)
{
td_goodsset2->MoveFirst();
}
else
{
td_goodsset2->Move(number);//此成员函数用来在记录集中向前或向后移动当前记录指针
td_goodsset2->Delete(); //删除当前记录集的指针
m_goodsinflist.DeleteItem(number); //从数据源中删除位于指定索引位置的记录。
number = -1;
}
td_goodsset2->Requery();//更新记录集
------解决方案--------------------
警告:
当你调用Delete时,记录集必须被更新,并且当前在记录集中必须有有效的记录;否则将发生错误。例如,如果你删除了一个记录,但是在你再次调用Delete之前没有滚动到一个新的记录,则Delete会抛出一个CDBException。与AddNew和Edit不同,Delete调用后不跟Update调用。如果Delete调用失败,字段数据成员将保持不变。

示例:
这个例子说明了如何在一个函数框架上创建一个记录集。该例子假定pDB 存在,一个CDatabase类型的指针已经连接到数据源上。
CDatabase* pDB = theApp.GetDBConnect();
CRecordset recset(pDB);
CString strSQL = "SELECT * FROM [" + m_strTablename + "$] WHERE 序号='"+str+"'";
recset.Open(CRecordset::forwardOnly, strSQL);
if( recset.IsEOF() || !recset.CanUpdate() || !recset.CanTransact() ) 
return;
if( !m_pDB->BeginTrans( ) )
{
// Do something to handle a failure
}
else
{
// Perhaps scroll to a new record ...
// Delete the current record
recset.Delete( );
// ...
// Finished commands for this transaction
if( )
m_pDB->CommitTrans( );
else // User changed mind
m_pDB->Rollback( );
}

------解决方案--------------------
CDatabase::BeginTrans

BOOL BeginTrans();

返回值:
如果调用成功并且只手工提交改变,则返回非零值,否则为0。

说明:
调用这个成员函数,可以开始连接数据源的事务。一个事务包含一个或更多的CRecordset对象的AddNew,Edit,Delete和Update成员函数。