当前位置 博文首页 > 启舰:给DATAGRID控件生成的列表添加序号

    启舰:给DATAGRID控件生成的列表添加序号

    作者:[db:作者] 时间:2021-06-12 21:43

    我用的数据库是ACCESS 2003,查了好多资料才知道ACCESS用的是JET SQL,而SQL SERVER 用的是T-SQL,有很大差别,JET SQL是相当烂的,很多不支持,本来想用declare来声明游标来解决,谁知道ACCESS根本不识别

    最后没办法,只能选用了,生成临时表的方法,而JET SQL不支持生成临时表,所以只能生成表了,后面再删除是一样的。

    我用的是VS2008 +MFC

    主要方法是:

    1、首先判断要生成的表tempTable是否已经存在,如果存在则先删除之(这一步主要是以防发生异常)

    2、然后生成临时表tempTable,将查询结果存入其中

    3、再给此临时表加一个ID列,将其属性设置为“自动编号”

    4、最后将此临时表传递给DATAGRID控件,让其显示

    代码及说明如下:

    m_ptrRecordset-> CursorLocation = adUseClient;?? //非常重要,如果没有,则无法显示数据

    m_ptrConnection-> CursorLocation?? =?? adUseClient;

    CString temp_s=L"";

    ?

    long l=0;

    _variant_t NO;

    temp_s.Format(L"SELECT Count(*) AS RTab FROM MSysObjects WHERE (((MSysObjects.Name) Like \"%s\"));",L"tempTable");

    //这条SQL语句是用于判断是否已经存在tempTable表,下面实现的是如果存在则将其删除

    m_ptrRecordset=m_ptrConnection->Execute(_bstr_t(temp_s),COleVariant(l),adCmdText);

    NO=m_ptrRecordset->GetCollect(COleVariant(long(0)));

    if(NO.vt==VT_I4) //先判断是否存在tempTable表,如果存在则先将其删除

    {

    ???? if(NO.lVal>0)

    ???? {

    ???????? m_ptrConnection->Execute(_bstr_t(L"drop table tempTable"),COleVariant(l),adCmdText);

    ???? }

    }

    ?

    ?

    temp_Str.Format(L"select? Main.FileName ,Main.InningsNum ,Main.Date ,Main.ItemAttribute INTO tempTable from Main where Main.Date between #%s# and #%s#? ORDER BY Main.Id",startTime,endTime);

    m_ptrConnection->Execute(_bstr_t(temp_Str),COleVariant(l),adCmdText); ?

    //此SQL语句,是将查询结果生成一个新表tempTable并将其保存在新生成的表中

    ?

    m_ptrConnection->Execute(_bstr_t(L"alter table tempTable add id Counter "),COleVariant(l),adCmdText);

    //这条语句实现修改新生成的tempTable表,给其新增加一列名为ID,属性是自动编号即Counter

    //下面这篇文章包含了ACCESS中所有列的属性值

    //http://hi.baidu.com/djiznew/item/0faef5eb8ddbede3fa42ba8c

    ?

    if(m_ptrRecordset->GetState()==adStateOpen)? //判断数据集是否是打开的,如果打开则关闭

    {

    ???? m_ptrRecordset->Close();

    }

    ?

    HRESULT hr = m_ptrRecordset->Open(_bstr_t(L"select? ?id as [序号],FileName as [文件名],InningsNum as [局次],Date as [比赛时间],ItemAttribute as [项目属性]? from tempTable order?? by?? id"), _variant_t((IDispatch*)m_ptrConnection, TRUE),adOpenStatic, adLockBatchOptimistic, adCmdUnknown);

    if(hr != S_OK)

    {

    ???? AfxMessageBox(L"create recordset error!");

    ???? return;

    }

    ?????????????

    m_dataGrid.putref_DataSource((LPUNKNOWN)m_ptrRecordset);? //实现将CRecordset与我们的DATAGRID控件连接起来

    m_dataGrid.Refresh();? // m_dataGrid变量为关联DATAGRID控件的变量

    ?

    this->m_ptrConnection->Execute(_bstr_t(L"drop table tempTable"),COleVariant(l),adCmdText);?

    //在连接DATAGRID后,删除tempTable表

    ?

    ?

    存在问题

    由于msysobjects对象默认是不对外开放的,也就是不能修改的,所以我们必须先修改一些选项,然后才能实现它的操作,否则会在执行到

    temp_s.Format(L"SELECT Count(*) AS RTab FROM MSysObjects WHERE (((MSysObjects.Name) Like \"%s\"));",L"tempTable");

    这条语句时报错

    解决办法:

    在admin的权限里添加对msysobjects的更新操作就可以了嘛
    默认的情况是admin对msysobjects没有任何权限!包括查询
    access?2000

    工具?->?选项?->?视图?->?隐藏对象、系统对象?
    前面的勾选上。

    工具?->?安全?->?用户与组的权限,对象类型选择“表”
    在对象名称中选定?MSysObjects?,然后权限中设置其权限。

    ?

    ?

    下一篇:没有了