今天中午心血来潮决定优化一下昨天的程序。现在想来这真是个错误的决定…
我用了半天的时间来弄,到现在还没弄好,却又是食之无味弃之可惜。最后还是把加的代码全部删去了,把原始版发给了老师,哎,我真是自己作啊。
但是,他喵的花了这么多时间,当做什么都没做就太亏了,我得记下来,免得下次遇到这个问题又重新来一遍。胸中一股闷气<<<
利用VS2010(ADO)获取Access2013的表名和字段信息
获取表名
第一种方法
ADO m_Ado;
m_Ado.OnInitADOConn();//这个函数修改一下,把数据库的路径作为输入。这里先不动。
CString strSql;
strSql = _T("select name from MSysObjects where type=1 and flags=0");//sql语句
m_Ado.m_pRecordset = m_Ado.OpenRecordset(strSql);//打开记录集
CString strTable;
while(!m_Ado.m_pRecordset->adoEOF)
{
strTable=(char*)(_bstr_t)m_Ado.m_pRecordset->GetFields()->GetItem("Name")->Value;
m_table.AddString(strTable);//加入combbox控件
}
UpdateData(FALSE);//显示
m_table.SetCurSel(0);
以上是第一种方法。
但是会报错,如下:
网上搜了一下,原因是程序没有访问MSysObjects 表的权限。
网上有设置该权限的方法:
1、打开您的 Access 数据库,然后在 Access 窗口上选择:工具 → 选项 → 视图;
2、将“隐藏对象”和“系统对象”前面的勾选上,可以看到隐藏的一些表出现了;
3、然后继续选择:工具 → 安全 → 用户与组的权限;
4、在对象名称中选定 MSysObjects ,然后权限中设置其权限。
悲催的是,这个方法只适用于Access 07以下的版本,07之后的版本取消了【用户与组权限】这一个功能。
所以,必须把数据库文件另存为低版本的access文件(.mdb),这么一来,连接字符串也必须做更改。
这样设置以后,程序可以运行了,但是又出现了一个问题:
程序卡死了。
调试中发现,是while循环的锅,好像是无限循环了。为什么会怎样,!
低级错误,没有加入循环的操作(i++)。真的是,我佛了!
在whlie循环的最后加入:
m_Ado.m_pRecordset->MoveNext();
然后完美运行!
第二种方法
m_Ado.m_pRecordset = m_Ado.m_pConnection->OpenSchema(adSchemaTables);//打开记录集
CString strTable;
while(!m_Ado.m_pRecordset->adoEOF)
{
strTable = (char*)(_bstr_t)m_Ado.m_pRecordset->GetFields()->GetItem("TABLE_TYPE")->Value;
if(strTable == "TABLE")
{
CString name=(char*)(_bstr_t)m_Ado.m_pRecordset->GetFields()->GetItem("TABLE_NAME")->Value;
m_table.AddString(name);
}
m_Ado.m_pRecordset->MoveNext();
}
m_Ado.CloseRecordset();
m_Ado.CloseConn();//断开数据库连接
这也是一种方法,可以看到只是打开记录集的方式不同。
http://blog.csdn.net/adminlhb/article/details/4500348
不知道可不可行。有时间可以试一下,说不定可以解决权限的问题。
获得表的字段
ADO m_Ado;
m_Ado.OnInitADOConn();//这个函数修改一下,把数据库的路径作为输入。这里先不动。
CString strSql,strTable;
strTable="table1";
strSql = "select * from " +strTable+" where false";//sql语句
m_Ado.m_pRecordset = m_Ado.OpenRecordset(strSql);//打开记录集
int nCount=m_Ado.m_pRecordset->GetFields()->Count;
CString colname;
long i=0; //这个地方是long,不然会报错,吃了亏了
while(i<nCount)
{
colname=(char*)(_bstr_t)m_Ado.m_pRecordset->GetFields()->GetItem(i)->GetName();
m_list.InsertColumn(i,colname,LVCFMT_LEFT,110,0);
i++;
}
//读取数据
AddToGrid();
OK,完成!
参考文章:
http://blog.csdn.net/auragreen/article/details/12564177
http://walkerqt.blog.51cto.com/1310630/1281423/
http://www.myexception.cn/vc-mfc/1214340.html