ADO数据库编程入门 liandong(原作)[2]

[入库:2005年8月18日] [更新:2007年3月27日]

本文简介:选择自 westerly 的 blog

    (_variant_t("name"))->value);
   short cage=(short)(m_precordset->fields->getitem
    (_variant_t("age"))->value);
   //do something what you want to do:
   ......
   m_precordset->movenext();   
  }
 }//try
 catch (_com_error &e)
 {
  cstring str=(char*)e.description();
  ::messagebox(null,str+"\n又出毛病了。","提示",
mb_ok | mb_iconwarning);
 }

本例中的name和age都是字段名,读取的字段值分别保存在sname和cage变量内。例中的fields是recordset对象的容器,getitem方法返回的是field对象,而value则是field对象的一个属性(即该字段的值)。通过此例,应掌握操纵对象属性的方法。例如,要获得field 对象的value属性的值可以直接用属性名value来引用它(如上例),但也可以调用get方法,例如:
cstring sname=(char*)(_bstr_t)(m_precordset->fields->getitem
    (_variant_t("name"))->getvalue());
从此例还可以看到,判断是否到达记录集的末尾,使用记录集的adoeof属性,其值若为真即到了结尾,反之则未到。判断是否到达记录集开头,则可用bof属性。
另外,读取数据还有一个方法,就是定义一个绑定的类,然后通过绑定的变量得到字段值(详见后面的介绍)。
5、修改数据
方法一:
 try{
  m_precordset->movefirst();  
  while(m_precordset->adoeof==variant_false) 
  {   
   m_precordset->fields->getitem
    (_variant_t("姓名"))->value=_bstr_t("赵薇");
   ......
   m_precordset->update();

   m_precordset->movenext();   
  }
 }//try
改变了value属性的值,即改变了字段的值。
方法二:
  m_precordset->fields->getitem
    (_variant_t("姓名"))->putvalue(_bstr_t("赵薇"));
方法三:就是用定义绑定类的方法(详见后面的介绍)。
6、添加记录
新记录添加成功后,即自动成为当前记录。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挺麻烦。
方法三:就是用定义绑定类的方法(详见后面的介绍)。
7、删除记录
调用recordset的delete方法就行了,删除的是当前记录。要了解delete的其它用法请查阅参考文献。
 try{
  m_precordset->movefirst();  
  while(m_precordset->adoeof==variant_false) 
  {

本文关键:,ADO,
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top