ODBC,CDatabase,CRecordset [英] ODBC, CDatabase, CRecordset

查看:59
本文介绍了ODBC,CDatabase,CRecordset的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

CDatabase db;
CRecordset rcd;
...
rcd.Open(CRecordset::forwardOnly, "SELECT * FROM [sheet1$]", CRecordset::readOnly);
...



在此示例中,假定表名称为"sheet1".但是当我不知道名字的时候,我怎么能得到它呢?
预先感谢.



In this example it''s assumed that the table name is "sheet1". But when I don''t know the name, how can I get it?
Thanks in advance.

推荐答案

",CRecordset :: readOnly); ...
", CRecordset::readOnly); ...



在此示例中,假定表名称为"sheet1".但是当我不知道名字的时候,我怎么能得到它呢?
预先感谢.



In this example it''s assumed that the table name is "sheet1". But when I don''t know the name, how can I get it?
Thanks in advance.


您可以使用SQLTables函数从数据库中获取表名列表.

You can get the list of table names from a database using the SQLTables function.

// Example code for a CDatabase derived class to read Excel files
//  using the ODBC driver.
// Fill CStringArray with list of table names.
// System tables are Excel sheets (trailing dollar sign).
// Normal tables are named ranges (no trailing dollar sign). 
bool CMyDatabase::GetSheetNames(CStringArray& arr) const
{
    ASSERT(IsOpen());
    SQLHSTMT hst = NULL;
    SQLRETURN nSqlResult = ::SQLAllocHandle(SQL_HANDLE_STMT, m_hdbc, &hst);
    if (!SQL_SUCCEEDED(nSqlResult))
        TRACE1("Error %d in SQLAllocHandle()\n", nSqlResult);
    else
    {
        nSqlResult = ::SQLTables(hst, NULL, 0, NULL, 0, NULL, 0, NULL, 0);
        if (!SQL_SUCCEEDED(nSqlResult))
            TRACE1("Error %d in SQLTables()\n", nSqlResult);
        else 
        {
            // Col 1, TABLE_CAT:   File name
            // Col 2, TABLE_SCHEM: Not used with Excel
            // Col 3, TABLE_NAME:  Table name
            // Col 4, TABLE_TYPE:  Table type (e.g. TABLE, SYSTEM TABLE)
            // Col 5, REMARKS:     Not used with Excel
            // Max. sizes may be retrieved using SQLGetInfo().
            // 64 for Excel ODBC driver
            SQLTCHAR szName[64];
            //SQLTCHAR szType[64];
            SQLINTEGER cbName;
            //SQLINTEGER cbType;
            ::SQLBindCol(hst, 3, SQL_C_TCHAR, szName, sizeof(szName), &cbName);
            //::SQLBindCol(hst, 4, SQL_C_TCHAR, szType, sizeof(szType), &cbType);
            while ((nSqlResult = ::SQLFetch(hst)) != SQL_NO_DATA) 
            {
                if (SQL_SUCCEEDED(nSqlResult))
                    arr.Add(szName);
                else // if (SQL_ERROR == nSqlResult)
                {
                    TRACE1("Error %d fetching SQLTables\n", nSqlResult);
                    break;
                }
            }
        }
        ::SQLFreeHandle(SQL_HANDLE_STMT, hst);
    }
    return SQL_NO_DATA == nSqlResult && arr.GetSize();
}


这篇关于ODBC,CDatabase,CRecordset的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆