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

我用的数据库是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 ,然后权限中设置其权限。

 

 

你可能感兴趣的:(sql,sql,server,datagrid,table,mfc,Access)