在VS环境下使用ADO操作Oracle数据库,是很多Windows平台开发场景下的常见需求,尤其适合维护老项目或开发轻量桌面应用。下面我们一步步梳理完整的实现流程。

环境准备
首先需要确保本地环境满足以下条件:
- 已安装Visual Studio,建议版本为2015及以上,本文以VS2019为例
- 已安装Oracle客户端,或者Oracle Instant Client,需要匹配本地系统位数和Oracle数据库版本
- 已安装Oracle ODBC驱动,ADO需要通过ODBC驱动或者OLE DB提供程序连接Oracle
配置ADO依赖
在VS项目中引入ADO相关的库文件,步骤如下:
- 打开项目属性,找到配置属性下的C/C++选项,在附加包含目录中添加ADO类型库路径,通常路径为
C:\Program Files\Common Files\System\ado - 在代码文件中导入ADO类型库,使用如下代码:
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")
// 导入ADO类型库,重命名EOF避免和项目中的其他定义冲突建立Oracle数据库连接
连接Oracle需要正确的连接字符串,这里以使用Oracle OLE DB提供程序为例,连接字符串格式如下:
// 定义连接字符串,替换为实际的数据库信息 _bstr_t strConnect = "Provider=OraOLEDB.Oracle;Data Source=127.0.0.1:1521/orcl;User ID=test_user;Password=test_pwd;"; // Data Source格式为IP:端口/服务名,User ID是数据库用户名,Password是对应密码
完整的连接代码示例:
#include <iostream>
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")
int main() {
// 初始化COM组件
CoInitialize(NULL);
_ConnectionPtr pConn = NULL;
try {
// 创建连接对象
HRESULT hr = pConn.CreateInstance(__uuidof(Connection));
if (SUCCEEDED(hr)) {
_bstr_t strConnect = "Provider=OraOLEDB.Oracle;Data Source=127.0.0.1:1521/orcl;User ID=test_user;Password=test_pwd;";
// 打开数据库连接,超时时间设置为10秒
pConn->Open(strConnect, "", "", adConnectUnspecified);
std::cout << "数据库连接成功" << std::endl;
}
} catch (_com_error &e) {
// 捕获连接异常,输出错误信息
std::cout << "连接失败:" << (char*)e.Description() << std::endl;
}
// 关闭连接,释放COM资源
if (pConn && pConn->State == adStateOpen) {
pConn->Close();
}
pConn.Release();
CoUninitialize();
return 0;
}执行增删改查操作
查询数据
使用_RecordsetPtr对象执行查询语句,获取结果集:
_RecordsetPtr pRs = NULL;
try {
// 创建记录集对象
pRs.CreateInstance(__uuidof(Recordset));
// 执行查询语句,从test_table表查询所有数据
pRs = pConn->Execute("SELECT id, name FROM test_table", NULL, adCmdText);
// 遍历结果集
while (!pRs->adoEOF) {
// 获取id字段值,转换为整数
int id = pRs->Fields->GetItem("id")->Value;
// 获取name字段值,转换为字符串
_bstr_t name = pRs->Fields->GetItem("name")->Value;
std::cout << "id:" << id << " name:" << (char*)name << std::endl;
// 移动到下一条记录
pRs->MoveNext();
}
} catch (_com_error &e) {
std::cout << "查询失败:" << (char*)e.Description() << std::endl;
}
// 关闭记录集,释放资源
if (pRs && pRs->State == adStateOpen) {
pRs->Close();
}
pRs.Release();插入、更新、删除数据
增删改操作可以直接通过连接对象的Execute方法执行,不需要返回结果集:
try {
// 插入数据示例
pConn->Execute("INSERT INTO test_table(id, name) VALUES(1, '测试数据')", NULL, adCmdText);
std::cout << "插入数据成功" << std::endl;
// 更新数据示例
pConn->Execute("UPDATE test_table SET name='更新后的数据' WHERE id=1", NULL, adCmdText);
std::cout << "更新数据成功" << std::endl;
// 删除数据示例
pConn->Execute("DELETE FROM test_table WHERE id=1", NULL, adCmdText);
std::cout << "删除数据成功" << std::endl;
} catch (_com_error &e) {
std::cout << "操作失败:" << (char*)e.Description() << std::endl;
}常见问题排查
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 连接时提示找不到Oracle客户端 | 未安装Oracle客户端或Instant Client,或者位数不匹配 | 安装对应位数的Oracle Instant Client,并配置环境变量PATH指向客户端目录 |
| 连接字符串报错 | 服务名、端口、用户名或密码错误 | 确认Oracle数据库的服务名和端口,使用sqlplus先测试连接是否正常 |
| 执行SQL语句报错 | SQL语法错误,或者字段名、表名不存在 | 先在Oracle客户端工具中测试SQL语句是否正确,再放到代码中执行 |
按照以上步骤操作,就可以在VS环境下通过ADO完成Oracle数据库的基本操作,实际开发中可以根据需求封装对应的数据库操作类,提高代码复用性。