VS2010 数据库操作(基于Access 2013)之二

今天中午心血来潮决定优化一下昨天的程序。现在想来这真是个错误的决定…
我用了半天的时间来弄,到现在还没弄好,却又是食之无味弃之可惜。最后还是把加的代码全部删去了,把原始版发给了老师,哎,我真是自己作啊。
但是,他喵的花了这么多时间,当做什么都没做就太亏了,我得记下来,免得下次遇到这个问题又重新来一遍。胸中一股闷气<<<

利用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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值