在MFC中用ADO连接excel时找不到数据表

无论是用ADO的OpenSchema( adSchemaTables ),还是用 ADOX 的 _CatalogPtr 找系统表,都找不到数据表,而文件里面又确实有一个表,这是什么原因?
附程序代码:

ADODB::_ConnectionPtr m_pConnection;
ADODB::_RecordsetPtr m_pRecordset;
::CoInitialize( NULL );
m_pConnection.CreateInstance( __uuidof( ADODB::Connection ) );
m_pRecordset.CreateInstance( __uuidof( ADODB::Recordset ) );

CString csConnect;
csConnect.Format("Provider=Microsoft.ACE.OLEDB.12.0;"
            "Data Source='txlx.xls'; Extended Properties='Excel 8.0;HDR=YES;IMEX=0'" );

_bstr_t strConnect;
strConnect = csConnect;

try{
m_pConnection ->Open( strConnect, "", "", ADODB::adConnectUnspecified );
}
catch( _com_error &e )
{
    CString szError;
    szError.Format( "数据库连接失败!\n%s\n%s", e.ErrorMessage(), (char*)(e.Description()) );
    MessageBox( szError );
}

_CatalogPtr m_pCatalog = NULL;
_TablePtr m_pTable = NULL;
m_pCatalog.CreateInstance( __uuidof( Catalog ));

try{
m_pCatalog ->PutActiveConnection( _variant_t((IDispatch*)m_pConnection));
}
catch( _com_error &e )
{
    CString szError;
    szError.Format( "数据目录关联失败!\n%s\n%s", e.ErrorMessage(), (char*)(e.Description()) );
    MessageBox( szError );
}

_variant_t vIndex = (short)0;

try{
    m_pTable = m_pCatalog ->Tables ->GetItem( vIndex );
    AfxMessageBox( m_pTable ->Name );
}
catch( _com_error &e )
{
    CString szError;
    szError.Format( "数据表获取失败!\n%s\n%s", e.ErrorMessage(), (char*)(e.Description()) );
    MessageBox( szError );
}


if( m_pRecordset != NULL && m_pRecordset ->State == ADODB::adStateOpen )
{
    m_pRecordset ->Close();
}

if( m_pConnection != NULL )
{
    m_pConnection->Close();
}

m_pConnection.Release();
m_pRecordset.Release();
::CoUninitialize(); 

错误提示:数据表获取失败!
                在对应所需名称或序数的集合中,未找到项目。

1个回答

csConnect.Format("Provider=Microsoft.ACE.OLEDB.12.0;"
"Data Source='txlx.xls'; Extended Properties='Excel 8.0;HDR=YES;IMEX=0'" );
你这个代码按理说根本都不能编译啊,两个字符串,中间没有任何符号。
你贴的是原始代码么?
另外datasource写完整的路径和文件名,以及,你确认ace12.0是否安装了。

mwq0611
mwq0611 问题解决了,确实是文件路径的问题。对于相对路径,在控制台程序中,数据库文件应该与程序文件在一个文件夹中(即DEBUG文件夹中);但在MFC程序中,数据库文件要求与工程文件在一个文件夹中(即在DEBUG文件夹的上层文件夹中),而我同样把数据库文件放在了DEBUG文件夹中,所以找不到表(但连接时不抛出异常,这很奇怪)。更正数据库文件位置后一切正常,谢谢你的关注。
一年多之前 回复
mwq0611
mwq0611 还有,如果我用 _ConnectionPtr->OpenSchema(adSchemaTables)得到一个结果集,程序运行时显示结果集为空,这是为什么?
一年多之前 回复
mwq0611
mwq0611 我贴的是原始代码。我试过,在VC++6.0中,两个字符串是可以自动连接的。当excel表格与exe文件在一个文件夹中时,可以用相对路径,即只要写文件名就可以了。ACE 12.0 也安装了。还有,就是这个程序在控制台程序中可以运行,但就是在 MFC 中就是找不到表,不知道为什么?
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问