这些天在做Excel和Access互转的工作,在获取Access字段名的问题上纠结了好久,就是没有正确获取所有字段,今天终于调试通过了,总结下:
最初,是在网上学习别人的方法,我想大家应该也都能搜到,但那两种方法都有些问题吧,一个是获取的字段不完全是表中的字段,还有一些其他的
非定义的字段,并且获取的字段顺序也不是和我们表中字段的顺序是一样的;另一个呢就完全都得不到字段;
第一个方法是这样的:
CString csField;
_RecordsetPtr pRst = NULL;
pRst.CreateInstance( __uuidof(Recordset) );
pRst = m_pConnection->OpenSchema(adSchemaColumns);//这句是关键
while(!(pRst->adoEOF))
{
_bstr_t colname = pRst->Fields->GetItem("COLUMN_NAME")->Value;//获取字段名
vFields.push_back((wchar_t*)colname);
pRst->MoveNext();
}
获取的字段集中含有其他非定义字段,并且顺序发生了重排;这个不知道怎么调试,总之得不到正确的结果,有知道的告诉一声;
另一个方法:
int nCount = pRst->Fields->GetCount();//字段总数
//pRst = m_pConnection->OpenSchema(adSchemaColumns);//只有加上这一句,才能把字段给读出来
_bstr_t colname;
FieldsPtr pFields = pRst->GetFields();
for(inti=0; i< nCount; i++)//按记录集的各字段循环
{
//colname = pRst->Fields->GetItem("COLUMN_NAME")->Value;//获取字段名
FieldPtr pField = pFields->Item[i];
colname = pField->GetName();
vFields.push_back((wchar_t*)colname);
}
原先大致是这样的,然后我修改成:
_RecordsetPtr pRst = NULL;
pRst.CreateInstance( __uuidof(Recordset) );
pRst->PutRefActiveConnection( m_pConnection );
int nCount = pRst->Fields->GetCount();//字段总数
//pRst = m_pConnection->OpenSchema(adSchemaColumns);//只有加上这一句,才能把字段给读出来
_bstr_t colname;
FieldsPtr pFields = pRst->GetFields();
for(int i=0; i< nCount; i++)//按记录集的各字段循环
{
//colname = pRst->Fields->GetItem("COLUMN_NAME")->Value;//获取字段名
FieldPtr pField = pFields->Item[i];
colname = pField->GetName();
vFields.push_back((wchar_t*)colname);
}
就是添加了创建记录集的代码,经过调试发现得不到字段集,nCount是为0;
然后继续,改变获取记录集的方式,在此基础上,创建一个查询表的记录集,然后再去获取字段
CString csQuery;
csQuery.Format(L"SELECT * FROM [%s]",csTable);
_RecordsetPtr pRst = GetRecordset(csQuery);//获取记录集
int nCount = pRst->Fields->GetCount();//字段总数
//pRst = m_pConnection->OpenSchema(adSchemaColumns);//只有加上这一句,才能把字段给读出来
_bstr_t colname;
FieldsPtr pFields = pRst->GetFields();
for(int i=0; i< nCount; i++)//按记录集的各字段循环
{
//colname = pRst->Fields->GetItem("COLUMN_NAME")->Value;//获取字段名
FieldPtr pField = pFields->Item[i];
colname = pField->GetName();
vFields.push_back((wchar_t*)colname);
}
这次总算获取到了字段的数目,感觉离成功不远了,但到FieldPtr pField = pFields->Item[i];时,就会退出,无法获取字段对象;
反复修改了几次这行代码,感觉没错,但就是得不到结果,经过调试,才发现原来item的参数必须为长整型long,这样就好了,
得到完整的字段集了;正确代码如下:
CString csQuery;
csQuery.Format(L"SELECT * FROM [%s]",csTable);
_RecordsetPtr pRst = GetRecordset(csQuery);//获取记录集
int nCount = pRst->Fields->GetCount();//字段总数
//pRst = m_pConnection->OpenSchema(adSchemaColumns);//只有加上这一句,才能把字段给读出来
_bstr_t colname;
FieldsPtr pFields = pRst->GetFields();
for(long i=0; i< nCount; i++)//按记录集的各字段循环
{
//colname = pRst->Fields->GetItem("COLUMN_NAME")->Value;//获取字段名
FieldPtr pField = pFields->Item[i];
colname = pField->GetName();
vFields.push_back((wchar_t*)colname);
}