打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
读取excel表的字段名
这些天在做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);
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
ADO开发中如何得到表格字段名
Spark-SQL之DataFrame操作大全
求出表中字段名并字符串显示
ADO数据库连接
oracle 字段like多个条件(or关系)
关于织梦dedecms搜索列表不显示自定义字段的解决方法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服