MFC单文档ADO数据库
时间: 2024-12-30 09:30:59 浏览: 9
### MFC 单文档界面 ADO 数据库连接与操作教程
#### 创建项目并配置环境
为了在MFC单文档应用程序中使用ADO进行数据库操作,首先需要创建一个新的MFC单文档工程。完成项目的初始化设置之后,在`stdafx.h`文件顶部加入必要的头文件声明:
```cpp
#import "C:\Program Files\Common Files\System\ado\msadox.dll" no_namespace rename("EOF", "EndOfFile")
#import "C:\Program Files\Common Files\System\ado\msado15.dll" \
no_namespace rename("EOF","adEOF") rename("BOF","adBOF")
```
这些导入语句用于引入ADO所需的COM接口定义。
#### 定义全局变量
接着,在对话框类(通常是`CMFCApplicationNameView`)中的`.h`文件里添加三个私有成员变量来管理数据库连接、命令执行以及记录集的操作:
```cpp
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;
_CommandPtr m_pCommand;
```
这三者分别代表了与目标数据库建立的连接实例、查询返回的结果集合体以及用来构建SQL指令的对象[^2]。
#### 初始化连接
进入对应的CPP文件部分,可以在视图类构造函数内或者单独设立一个方法来进行ADO组件的初始化工作。这里展示了一个简单的例子说明怎样打开同本地安装好的Microsoft Access数据库之间的通信链路:
```cpp
void CMFCApplicationNameView::InitDatabase()
{
try {
if (!m_pConnection) {
m_pConnection.CreateInstance(__uuidof(Connection));
_bstr_t bstrConn = L"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\path\\to\\your.accdb;";
m_pConnection->Open(bstrConn, "", "", adModeUnknown);
}
} catch (_com_error &e) {
CString strError;
strError.Format(_T("Failed to connect database: %s"), (LPCTSTR)e.Description());
MessageBox(strError);
}
}
```
上述代码片段展示了如何利用ACE OLE DB Provider指定路径加载特定版本(.accdb)格式的Access文件作为数据源,并尝试建立起有效的会话通道[^3]。
#### 执行基本CRUD操作
一旦成功建立了稳定的网络传输渠道,则可以通过编写不同的逻辑分支去处理增删改查四种常见的事务请求。以下是几个典型场景下的示范代码:
##### 查询(Read)
```cpp
void CMFCApplicationNameView::DoQuery()
{
InitDatabase();
try {
m_pRecordset.CreateInstance(__uuidof(Recordset));
// 构造 SQL 语句
CString strSQL = L"SELECT * FROM TableName";
// 设置游标的属性以便于前后滚动浏览表项
m_pRecordset->CursorLocation = adUseClient;
m_pRecordset->Open((_variant_t)strSQL, m_pConnection.GetInterfacePtr(), adOpenStatic, adLockOptimistic);
while (!m_pRecordset->adoEOF) { // 遍历整个表格直至结束标志位被触发
// 获取当前行的数据...
m_pRecordset->MoveNext(); // 移动指针至下一位置继续循环读取新纪录
}
m_pRecordset->Close();
} catch (_com_error &e) {
// 错误处理机制...
}
}
```
##### 插入(Create)
```cpp
void CMFCApplicationNameView::InsertRecord(CString name)
{
InitDatabase();
try {
m_pCommand.CreateInstance(__uuidof(Command));
m_pCommand->ActiveConnection = m_pConnection;
CString strSQL = L"INSERT INTO TableName ([Field]) VALUES (?)";
m_pCommand->CommandText = strSQL;
_ParameterPtr pParam = m_pCommand->CreateParameter(L"name", adVarChar, adParamInput, name.GetLength(), name.AllocSysString());
m_pCommand->Parameters->Append(pParam);
long rowsAffected;
m_pCommand->Execute(NULL, NULL, adCmdText | adExecuteNoRecords);
} catch (_com_error &e) {
// 错误处理机制...
}
}
```
##### 更新(Update)
```cpp
void CMFCApplicationNameView::UpdateRecord(int id, CString newName)
{
InitDatabase();
try {
m_pCommand.CreateInstance(__uuidof(Command));
m_pCommand->ActiveConnection = m_pConnection;
CString strSQL = L"UPDATE TableName SET Field=? WHERE ID=?";
m_pCommand->CommandText = strSQL;
m_pCommand->Parameters->Append(m_pCommand->CreateParameter(L"newName", adVarChar, adParamInput, newName.GetLength(), newName.AllocSysString()));
m_pCommand->Parameters->Append(m_pCommand->CreateParameter(L"id", adInteger, adParamInput, sizeof(id), (long*)&id));
m_pCommand->Execute(NULL, NULL, adCmdText | adExecuteNoRecords);
} catch (_com_error &e) {
// 错误处理机制...
}
}
```
##### 删除(Delete)
```cpp
void CMFCApplicationNameView::DeleteRecord(int id)
{
InitDatabase();
try {
m_pCommand.CreateInstance(__uuidof(Command));
m_pCommand->ActiveConnection = m_pConnection;
CString strSQL = L"DELETE FROM TableName WHERE ID=?";
m_pCommand->CommandText = strSQL;
m_pCommand->Parameters->Append(m_pCommand->CreateParameter(L"id", adInteger, adParamInput, sizeof(id), (long*)&id));
m_pCommand->Execute(NULL, NULL, adCmdText | adExecuteNoRecords);
} catch (_com_error &e) {
// 错误处理机制...
}
}
```
以上示例涵盖了基于MFC框架下运用ADO技术实现对关系型数据库的基本访问模式[^1]。
阅读全文