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