以下是我用来访问 MS Access 数据库的代码 ODBC。我想要实现的是 ODBC 对话框没有出现。 我怀疑这与连接字符串有关。 请帮忙。
//#include "pch.h"
//#include "Db.h"
// pch.h: This is a precompiled header file.
#ifndef PCH_H
#define PCH_H
// add headers that you want to pre-compile here
#include "framework.h"
#endif //PCH_H
#pragma once
#include <atlstr.h>
#include <afxdb.h>
class CDb : public CDatabase
{
protected:
int m_iPrice;
const CString m_strSQL = L"SELECT Pay FROM tblOptions;";
CString strDsn;
public:
void setPrice();
int getPrice();
CDb();
virtual ~CDb();
};
void CDb::setPrice()
{
CString strDriver(L"Microsoft Access Driver (*.mdb, *.accdb)");
CString strFile(L"C:\\ExamplePath\\C++Projects\\lc\\lc.accdb");
//
strDsn.Format(L"ODBC;DRIVER={%s};DBQ=%s", strDriver, strFile);
Open(NULL, false, false, strDsn);
CRecordset rs;
// At this point the ODBC dialog opens
rs.Open(CRecordset::dynaset, m_strSQL);
CString strField;
rs.GetFieldValue(short(0), strField);
m_iPrice = _tstoi(strField);
rs.Close();
Close();
}
int CDb::getPrice()
{
return m_iPrice;
}
CDb::CDb()
{
setPrice();
}
CDb::~CDb()
{
m_iPrice = 0;
if(IsOpen())
Close();
}
// 以下是代码示例,即在FormView中实现显示代码 // 来自 MS Access 数据库
enter code here
Cmain1View::Cmain1View() noexcept
: CFormView(IDD_MAIN1_FORM)
, m_strText(_T(""))
{
CDb* pDb = new CDb();
CString m_str文本;
m_strText.Format(L"%d", pDb->getPrice());
删除 pDb;
pDb = NULL;
}
尝试调用
OpenEx()
成员,它需要一个选项参数,你必须添加 CDatabase::noOdbcDialog
选项。
连接字符串必须包含足够的信息,以便不需要凭据对话框。将以下部分添加到您的连接字符串
;Uid=%s;Pwd=%s
。用户名和密码必须从一些配置文件或注册表项中读取(这里有安全方面的考虑,但这不在本题范围内)。
或者,如果您可以覆盖建立连接的数据库类的成员(您将不得不深入研究 MFC 源代码),您可以更改代码,以便它调用包含
SQLDriverConnect()
选项的 SQL_DRIVER_NOPROMPT
函数.