首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

用ODBC读Excel,该怎么解决

2012-12-29 
用ODBC读ExcelCString strTablestrTable_T(综合录井表)sSql.Format(select * from [%s$],strTable)

用ODBC读Excel
CString strTable;
strTable=_T("综合录井表");
sSql.Format("select * from [%s$]",strTable);

        // 执行查询语句
        recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);


如代码,在连接Excel数据文件后,必须要知道Excel文件的表名“综合录井表”才可以产生产生记录集。有没有简单的方法,动态的获取Excel的工作表名。我看网上有人问过这样的问题,没有回答的。那位大侠帮帮忙。我是用ODBC读的,不要再推介我用其它方法读了。
[解决办法]
ODBC来获取,不清楚,
但是直接用OFFICE API是可以动态获得SHEET名的,你看看头文件
[解决办法]
驱动是否正确?
http://topic.csdn.net/t/20021012/14/1090480.html
[解决办法]

引用:
引用:
驱动是否正确?
http://topic.csdn.net/t/20021012/14/1090480.html

我装的是office 2003 驱动获取没有问题。关键是这个worksheet名现在没办法动态获取。必须手工输入worksheet名,

这个应该是的哟,就和ACCESS数据库中的表名称一样啊
[解决办法]
不要用数据库的方式操作excel
用com接口
http://wenku.baidu.com/view/563e90c7aa00b52acfc7caf4.html
[解决办法]
OpenSchema adSchemaTables
[解决办法]
odbc遍历求数据库中表名: 
bool   CDBInfoDlg::ListTables(bool   bViews,   bool   bSystemTables) 

CDatabase   database; 
CStringtype   =   " 'TABLE ' "; 
int ret=   -1; 
HSTMThStmt; 
UCHAR       szName[256]; 
SDWORD     cbName; 
CString   names; 

if(   bViews   ) 
type   +=   ",   'VIEW ' ";//视图 

if(   bSystemTables   ) 
type   +=   ",   'SYSTEM   TABLE ' ";//系统表 

try{ 
if(   !database.Open(m_strDSN)   ) 
return   false; 

catch(...){ 
AfxMessageBox( "Unable   To   Obtain   Table   Information "); 
return   false; 


SQLAllocStmt(database.m_hdbc,&hStmt); 
ret   =   SQLTables(hStmt, 
NULL,SQL_NTS, 
NULL,SQL_NTS, 
NULL,SQL_NTS, 
(unsigned   char   *)type.GetBuffer(0),SQL_NTS); 

if(ret   ==   SQL_ERROR){ 
SQLFreeStmt(hStmt,SQL_CLOSE); 
database.Close(); 
if(ret   ==     SQL_INVALID_HANDLE   ){ 
AfxMessageBox( "Invalid   handle "); 
return   false; 

AfxMessageBox( "Database   Could   Not   be   Open "); 
return   false; 



m_cmbTables.ResetContent(); 

while(1){ 

ret   =   SQLFetch(hStmt); 
if(ret   ==   SQL_NO_DATA_FOUND) 
break; 


ret   =   SQLGetData(hStmt,   3,   SQL_C_CHAR,   szName,   TABLE_NAME_LENGTH,   &cbName); 

names.Format( "%s ",szName); 
m_cmbTables.AddString(names); 


m_cmbTables.SetCurSel(0); 

SQLFreeStmt(hStmt,SQL_CLOSE); 
database.Close(); 

ShowTable(); 

return   true; 
}



ado 


void   CdbToolsDlg::GetDatabaseSchema(_ConnectionPtr   pConnection,   _bstr_t*   bstrTableNames,   int*   nTableCount,   _bstr_t   bstrFilter) 

ASSERT(pConnection-> State==adStateOpen); 
_RecordsetPtr     pRstSchema     =   NULL; 

SAFEARRAY   FAR*   psa   =   NULL; 
SAFEARRAYBOUND   rgsabound; 
_variant_t     var; 
_variant_t     Array; 
rgsabound.lLbound   =   0; 
rgsabound.cElements   =   4; 
psa   =   SafeArrayCreate(VT_VARIANT,   1,   &rgsabound); 
var.vt   =   VT_EMPTY; 
long   ix; 
ix   =   0; 
SafeArrayPutElement(psa,   &ix,   &var); 

ix=   1; 
SafeArrayPutElement(psa,   &ix,   &var); 

ix   =   2; 
SafeArrayPutElement(psa,   &ix,   &var); 

var.vt   =   VT_BSTR; 
//表的类型有 "ALIAS " "TABLE " "SYNONYM " "SYSTEM   TABLE " 
"VIEW " "GLOBAL   TEMPORARY " "LOCAL   TEMPORARY " "SYSTEM   VIEW " 
var.bstrVal   =   bstrFilter;//这里bstrFilter= "TABLE "就可以了 

ix   =   3; 
SafeArrayPutElement(psa,   &ix,   &var); 

var.vt=VT_EMPTY; 
Array.vt   =   VT_ARRAY
[解决办法]
VT_VARIANT; 
Array.parray   =   psa;   

try 

pRstSchema   =   pConnection-> OpenSchema(adSchemaTables,&Array); 

*nTableCount=0; 
while(!(pRstSchema-> EndOfFile)) 

if(bstrTableNames!=NULL) 

_bstr_t   table_name   =   pRstSchema-> Fields-> 
GetItem( "TABLE_NAME ")-> Value; 
*(bstrTableNames++)=table_name; 

*nTableCount+=1; 
pRstSchema-> MoveNext(); 


catch   (_com_error   e)   { 
PrintComError(e); 


if(pRstSchema) 
if   (pRstSchema-> State   ==   adStateOpen) 
pRstSchema-> Close(); 
}

------解决方案--------------------


好像是Connect的OpenSchema这个方法
[解决办法]
怎么会不行,你excel通过odbc进行连接后,本身就会被看成数据库。

热点排行