c++ - 使用 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;
}
解决方案
推荐阅读
- javascript - 我想在rails中保存数据类型float
- html - CSS - Div not taking up entire width
- reactjs - 如何使用 Styled Component for React JS 为同一个组件使用不同的属性?
- spring - 如何使用 Thymeleaf 显示自定义错误消息?
- macos - WSL2,Ubuntu DNS问题,无法解析主机
- python - python bs4 find() 返回无
- python - Python函数在所有可能的平方和中分解一个数字
- c# - WPF中加载文件的异步等待任务错误
- php - Dropzone文件上传新名称?
- awk - 计数取决于 awk 中列中的值