当前位置 博文首页 > 启舰:给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?,然后权限中设置其权限。
?
?