//我建立了一个acess数据库连接没有报错但是我想加入一个新的空条目就会报错

m_pRecordset.CreateInstance(__uuidof(Recordset)); // 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
// 因为它有时会经常出现一些想不到的错误。
try
{
m_pRecordset->Open("SELECT * FROM DataTab",                // 查询DataTab表中所有字段
theApp.m_pConnection.GetInterfacePtr(),  // 获取库接库的IDispatch指针
adOpenDynamic,
adLockOptimistic,
adCmdText);
///没有下面两句就不报错,这样不能建立一个空条目么
//我的数据库建立的时候我都设的允许为空,并自动生成编号 m_pRecordset->AddNew();

m_pRecordset->Update();
///
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}

解决方案 »

  1.   

    添加记录
    新记录添加成功后,即自动成为当前记录。AddNew方法有两种形式,一个含有参数,而另一个则不带参数。
    方法一(不带参数):
     // Add new record into this table:
     try{
      if(!m_pRecordset->Supports(adAddNew)) return;  m_pRecordset->AddNew(); 
      m_pRecordset->Fields->GetItem
       (_variant_t("姓名"))->Value=_bstr_t("赵薇");
      m_pRecordset->Fields->GetItem
       (_variant_t("性别"))->Value=_bstr_t("女");
      m_pRecordset->Fields->GetItem
       (_variant_t("age"))->Value=_variant_t((short)20);
      m_pRecordset->Fields->GetItem
       (_variant_t("marry"))->Value=_bstr_t("未婚");
      m_pRecordset->Update();  
     }//try
     catch (_com_error &e)
     {
      ::MessageBox(NULL, "又出毛病了。","提示",MB_OK | MB_ICONWARNING);
     }
    这种方法弄完了还要调用Update()。
    方法二(带参数):
      _variant_t varName[4],narValue[4];
      varName[0] = L"姓名";
      varName[1] = L"性别";
      varName[2] = L"age";
      varName[3] = L"marry";
      narValue[0]=_bstr_t("赵薇");
      narValue[1]=_bstr_t("女");
      narValue[2]=_variant_t((short)20);
      narValue[3]=_bstr_t("未婚");  const int nCrit = sizeof varName / sizeof varName[0];
      // Create SafeArray Bounds and initialize the array
      SAFEARRAYBOUND rgsaName[1],rgsaValue[1];
      rgsaName[0].lLbound = 0;   
      rgsaName[0].cElements = nCrit;
      SAFEARRAY *psaName = SafeArrayCreate( VT_VARIANT, 1, rgsaName );
      rgsaValue[0].lLbound = 0;
      rgsaValue[0].cElements = nCrit;
      SAFEARRAY *psaValue = SafeArrayCreate( VT_VARIANT, 1, rgsaValue );
      // Set the values for each element of the array
      HRESULT hr1=S_OK.hr2=S_OK;
      for( long i = 0 ; i < nCrit && SUCCEEDED( hr1 ) && SUCCEEDED( hr2 );i++)   
      {      
       hr1=SafeArrayPutElement(psaName, &i,&varName[i]);
       hr2=SafeArrayPutElement(psaValue, &i,&narValue[i]);       }
       
      // Initialize and fill the SafeArray
      VARIANT vsaName,vsaValue;   
      vsaName.vt = VT_VARIANT | VT_ARRAY;
      vsaValue.vt = VT_VARIANT | VT_ARRAY;
      V_ARRAY(&vsaName) = psaName;//&vsaName->parray=psaName;
       //see definition in oleauto.h file.
      V_ARRAY(&vsaValue) = psaValue;
       
      // Add a new record:
      m_pRecordset->AddNew(vsaName,vsaValue);
    这种方法不需要调用Update,因为添加后,ADO会自动调用它。此方法主要是使用SafeArray挺麻烦。
      

  2.   

    to zhangyilan;
    非常感谢!
    再请问一下,vc中怎样可以得到系统时间并将时间写到数据库中?(数据库中有一个字段定义成时间日期了)
      

  3.   

    format 成字符串
    转成bstr然后的操作就一样了