A Recordset object has a Fields collection made up of Field objects. Each Field object corresponds to a column in the Recordset. You can populate the Fields collection before opening the Recordset by calling the Refresh method on the collection 就是说Field与一个列相对应,而Fields是Field的集合
dataSource.Open();
BSTR connectString; dataSource.GetInitializationString(&connectString,true);
ConnectionStr = CString(connectString); //得到连接字符串
this->m_TableList.ResetContent();
ADOX_DB.CreateInstance(__uuidof(ADOX::Catalog));
try{
ADOX_DB->PutActiveConnection( _bstr_t(ConnectionStr) );
int tableCount = ADOX_DB->Tables->Count;
for(int i=0;i<tableCount;i++)
{//得到表对象指针
ADOX::_TablePtr tablePtr = (ADOX::_TablePtr)ADOX_DB->Tables->GetItem((long)i);
CString tableName = (BSTR)tablePtr->Name;//表名
//ADOX::PropertiesPtr tableProperties = (ADOX::PropertiesPtr)tablePtr->GetProperties();
ADOX::ColumnsPtr colunmsPtr = tablePtr->GetColumns();
//又表指针得到此表的字段指针,当然可以又表名来得到(查ado文档)
int colunmCount = colunmsPtr->Count;
for(...){
字段
}
m_TableList.AddString(tableName); }
} catch(_com_error &e) {
AfxMessageBox(e.Description());
}
下面是一段代码示例:
Fields *fields=NULL;//fields是一组field
Field *field=NULL;
try
{
hr=m_recordset->AddNew();
hr=m_recordset->get_Fields(&fields);
for(int i=0;i<nColNum;i++)
{
varCount.lVal=i;
hr=fields->get_Item(varCount,&field);
field->get_Type(&data_type);
if(!ConstructVar(saValues.GetAt(i),data_type,&varValue))
return FALSE;
hr=field->put_Value(varValue);
}
//提交
hr=m_recordset->Update();//must
fields->Release();
field->Release();
if(FAILED(hr))
AfxMessageBox("Insert Error");
}
catch(_com_error &e)
{
AfxMessageBox(e.Description());
m_recordset->Close();
return FALSE;
}
m_recordset->Close();
就是说Field与一个列相对应,而Fields是Field的集合
很明显FieldsPtr,FieldPtr是它们的指针类
带有Ptr的是ADO作为COM调用定义的接口指针
而Fields/Field则是ADO的数据类型
Fields/Field的区别很简单:
比如你的表里面有8列
那么Fields就是总体指代这8列的集合,
常用来遍历这个表以取得所有列的名字、类型等
而Field就是其中的一列
你可以用它来取得当前纪录的该列的数据
FieldsPtr, FieldPr的区别同样