c++ado记录集处理数据库update时的问题

问题1:使用记录集处理时,没有用update为什么服务器数据库中的数据也更改了?
问题2:而且如果使用update之后还会报错:'BOF 或 EOF 中有一个是“真”,或者当前的记录已被删除,所需的操作要求一个当前的记录。请问是什么原因?
代码如下:

//1、创建记录集
    HRESULT hr;
    _RecordsetPtr p_Recordset;    
    hr = p_Recordset.CreateInstance(_uuidof(Recordset));

    if (FAILED(hr))
    {
        error_ = _T("创建记录集失败");
        CGlobal::WriteLog(error_);
        return FALSE;
    }
    //2、调用open方法打开一个记录集
    try
    {
        CString StrSQL;
        StrSQL = _T("SELECT * FROM FCZL2017_temp");
        hr = p_Recordset->Open(_variant_t(StrSQL),p_Connection_.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);

        if (SUCCEEDED(hr))
        {
            //进行遍历操作
            while(!p_Recordset->GetadoEof())
            {
                CString sPriorityNo;
                sPriorityNo = p_Recordset->GetCollect("优先权号").bstrVal;
                if (sPriorityNo.Left(2) == _T("WO"))
                {
                    sPriorityNo.Delete(0,2);
                }
                p_Recordset->PutCollect(_variant_t("优先权号"),(_variant_t)sPriorityNo);
                p_Recordset->MoveNext();
            }
            //p_Recordset->Update();
        }
        else
        {
            error_ = _T("打开记录集失败");
            CGlobal::WriteLog(error_);
            return FALSE;
        }
    }
    catch (_com_error& e)
    {
        _bstr_t bStrSource(e.Source());
        _bstr_t bStrDescription(e.Description());
        error_ = (LPCSTR)bStrDescription;
        CGlobal::WriteLog(error_);
        return FALSE;
    }
    //long tem = p_Recordset->GetRecordCount();
    //关闭记录集
    p_Recordset->Close();
    p_Recordset = NULL;

顺便问一下_variant_t变量如何判断是否为空谢谢