读书人

用ODBC读Excel,该怎么解决

发布时间: 2012-12-29 10:28:09 作者: rapoo

用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进行连接后,本身就会被看成数据库。

读书人网 >VC/MFC

热点推荐