(_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)
{