oracle 的oci 将他封装成改一个C++类,增删改查,代码实现
时间: 2024-01-23 21:01:35 浏览: 80
以下是一个简单的封装OCI的C++类,实现对Oracle数据库的增删改查操作。
```c++
#include <iostream>
#include <string>
#include <oci.h>
class OracleDB {
public:
OracleDB() : envhp(nullptr), errhp(nullptr), srvhp(nullptr), svchp(nullptr), stmthp(nullptr) {}
~OracleDB() {
if (envhp) OCIHandleFree(envhp, OCI_HTYPE_ENV);
if (errhp) OCIHandleFree(errhp, OCI_HTYPE_ERROR);
if (srvhp) OCIHandleFree(srvhp, OCI_HTYPE_SERVER);
if (svchp) OCIHandleFree(svchp, OCI_HTYPE_SVCCTX);
if (stmthp) OCIHandleFree(stmthp, OCI_HTYPE_STMT);
}
bool connect(const std::string& user, const std::string& password, const std::string& db) {
OCIEnvCreate(&envhp, OCI_THREADED, nullptr, nullptr, nullptr, nullptr, 0, nullptr);
OCIHandleAlloc(envhp, (void**)&errhp, OCI_HTYPE_ERROR, 0, nullptr);
OCIHandleAlloc(envhp, (void**)&srvhp, OCI_HTYPE_SERVER, 0, nullptr);
OCIHandleAlloc(envhp, (void**)&svchp, OCI_HTYPE_SVCCTX, 0, nullptr);
OCILogon2(envhp, errhp, &svchp, (const OraText*)user.c_str(), user.length(), (const OraText*)password.c_str(), password.length(), (const OraText*)db.c_str(), db.length(), OCI_DEFAULT);
return true;
}
void disconnect() {
OCILogoff(svchp, errhp);
}
bool execute(const std::string& sql) {
OCIHandleAlloc(envhp, (void**)&stmthp, OCI_HTYPE_STMT, 0, nullptr);
OCIStmtPrepare(stmthp, errhp, (const OraText*)sql.c_str(), sql.length(), OCI_NTV_SYNTAX, OCI_DEFAULT);
OCIStmtExecute(svchp, stmthp, errhp, 1, 0, nullptr, nullptr, OCI_DEFAULT);
return true;
}
int query(const std::string& sql) {
OCIHandleAlloc(envhp, (void**)&stmthp, OCI_HTYPE_STMT, 0, nullptr);
OCIStmtPrepare(stmthp, errhp, (const OraText*)sql.c_str(), sql.length(), OCI_NTV_SYNTAX, OCI_DEFAULT);
OCIStmtExecute(svchp, stmthp, errhp, 0, 0, nullptr, nullptr, OCI_DEFAULT);
int cols = 0;
OCIAttrGet(stmthp, OCI_HTYPE_STMT, &cols, nullptr, OCI_ATTR_PARAM_COUNT, errhp);
return cols;
}
private:
OCIEnv* envhp;
OCIError* errhp;
OCIServer* srvhp;
OCISvcCtx* svchp;
OCIStmt* stmthp;
};
int main() {
OracleDB db;
db.connect("user", "password", "db");
// 插入数据
db.execute("INSERT INTO table_name(col1, col2) VALUES('value1', 'value2')");
// 更新数据
db.execute("UPDATE table_name SET col1='new_value1' WHERE col2='value2'");
// 删除数据
db.execute("DELETE FROM table_name WHERE col1='new_value1'");
// 查询数据
int cols = db.query("SELECT * FROM table_name WHERE col2='value2'");
std::cout << "Number of columns: " << cols << std::endl;
db.disconnect();
return 0;
}
```
这个类中,connect函数用于连接数据库;disconnect函数用于断开连接;execute函数用于执行insert、update、delete等操作;query函数用于执行select操作,并返回结果列数。这只是一个简单的实现,具体的实现方式可以根据实际需要进行调整。
阅读全文