首页 > 解决方案 > 使用 ODBC 读取/写入 excel

问题描述

我正在编写一个 MFC 程序来创建一个带有两个按钮(读取和写入)的对话框,当单击读取按钮时
,会调用读取 excel 的功能。在我运行程序并单击
读取按钮后,VS(2012) 编译器显示 Microsoft Jet 找不到
“演示”文件的数据库错误,这是文件读取功能应该读取的。谁能告诉
我出了什么问题?太感谢了!这是我的代码。

    void CMFCApplication1Dlg::WriteToExcel()
    {
        CDatabase database;
        CString sDriver = _T("Microsoft Excel Driver (*.xls)"); 
        CString sExcelFile = _T("d:\\demo.xls"); 
        CString

 sSql;
    TRY
    {

        sSql.Format(_T("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s"),sDriver, sExcelFile, sExcelFile);

    if (database.OpenEx(sSql,CDatabase::noOdbcDialog))
    {

        sSql = "CREATE TABLE demo (Name TEXT,Age NUMBER)";
        database.ExecuteSQL(sSql);


        sSql = "INSERT INTO demo (Name,Age) VALUES ('qinshujin',32)";
        database.ExecuteSQL(sSql);

        sSql = "INSERT INTO demo (Name,Age) VALUES ('jiyingjun',28)";
        database.ExecuteSQL(sSql);

        sSql = "INSERT INTO demo (Name,Age) VALUES ('zhangqi',28)";
        database.ExecuteSQL(sSql);
    }

    database.Close();
    }
        CATCH_ALL(e)
    {
        TRACE1("Excel driver is not installed: %s", sDriver);
    }
    END_CATCH_ALL;
}



CString CMFCApplication1Dlg::GetExcelDriver()
{
    char szBuf[2001];
    WORD cbBufMax = 2000;
    WORD cbBufOut;
    char *pszBuf = szBuf;
    CString sDriver;


    if (!SQLGetInstalledDrivers(szBuf, cbBufMax, &cbBufOut))
        return _T("");


    do
    {
        if (strstr(pszBuf, "Excel") != 0)
        {

            sDriver = CString(pszBuf);
            break;
        }
        pszBuf = strchr(pszBuf, '\0') + 1;
    } while (pszBuf[1] != '\0');

    return sDriver;
}


void CMFCApplication1Dlg::ReadFromExcel()
{
    CDatabase database;
    CString sSql;
    CString sItem1, sItem2;
    CString sDriver;
    CString sDsn;
    CString sFile = "d:\\demo.xls"; 
    sDriver = GetExcelDriver();
if (sDriver.IsEmpty())
{

    cout << "NO Excel Driver!" << endl;
    return;
}

sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s", sDriver, sFile);

TRY
{
    database.Open(NULL, false, false, sDsn);

CRecordset recset(&database);

sSql = "SELECT Name, Age "
    "FROM demo "
    "ORDER BY Name ";

recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);

while (!recset.IsEOF())
{
    recset.GetFieldValue("Name", sItem1);
    recset.GetFieldValue("Age", sItem2);
    cout << sItem1 << "\t" << sItem2 << endl;

    recset.MoveNext();
}

database.Close();

}
    CATCH(CDBException, e)
{
    AfxMessageBox("Error: " + e->m_strError);
}
END_CATCH;
}

标签: c++visual-c++mfcodbc

解决方案


推荐阅读