Oracle+VS2015+C++使用记录

Oracle+VS2015+C++使用记录

C++连接Oracle数据库的方法有如下几种:

  • ADO方式
  • oracle本身提供的Proc*C/C++
  • OCCI方式

ADO方式

ADO方式我认为应该是最简单粗暴的一种了, 我们甚至不需要详细了解ADO即可操作Oracle数据库

首先是一个数据库操作类 代码来自@ArliceDOTlice

DBOperation.h:

#pragma once
#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")
#include"stdafx.h"
class CDBOperation
{
public:
    //初始化数据库操作需要的对象
    CDBOperation(void);
    ~CDBOperation(void);

    //连接至数据库
    bool ConnToDB(char *ConnectionString, char *UserID, char *Password);

    //数据库操作函数
    //查询操作 删除以及添加
    _RecordsetPtr ExecuteWithResSQL(const char*);

private:
    void PrintErrorInfo(_com_error &);

private:
    //初始化数据库连接、命令、记录集
    _ConnectionPtr CreateConnPtr();
    _CommandPtr CreateCommPtr();
    _RecordsetPtr CreateRecsetPtr();

private:
    //数据库连接需要的连接、命令操作对象
    _ConnectionPtr m_pConnection;
    _CommandPtr m_pCommand;
};

DBOperation.cpp

#include "stdafx.h"
#include "DBOperation.h"
CDBOperation::CDBOperation(void)
{
    CoInitialize(NULL);
    m_pConnection = CreateConnPtr();
    m_pCommand = CreateCommPtr();
}
CDBOperation::~CDBOperation(void)
{
    m_pConnection->Close();
}
bool CDBOperation::ConnToDB(char *ConnectionString, char *UserID, char *Password)
{
    if (NULL == m_pConnection)
    {
        printf("Failed to create connection\n");
        return false;
    }
    try
    {
        HRESULT hr = m_pConnection->Open(ConnectionString, UserID, Password, NULL);
        if (TRUE == FAILED(hr))
        {
            return false;
        }
        m_pCommand->ActiveConnection = m_pConnection;
        return true;
    }
    catch (_com_error &e)
    {
        PrintErrorInfo(e);
        return false;
    }
}
_RecordsetPtr CDBOperation::ExecuteWithResSQL(const char *sql)
{
    try
    {
        m_pCommand->CommandText = _bstr_t(sql);
        _RecordsetPtr pRst = m_pCommand->Execute(NULL, NULL, adCmdText);
        return pRst;
    }
    catch (_com_error &e)
    {
        PrintErrorInfo(e);
        return NULL;
    }
}
void CDBOperation::PrintErrorInfo(_com_error &e)
{
    printf("Error infomation are as follows\n");
    printf("ErrorNo: %d\nError Message:%s\nError Source:%s\nError Description:%s\n", e.Error(), e.ErrorMessage(), (LPCTSTR)e.Source(), (LPCTSTR)e.Description());
}

_ConnectionPtr CDBOperation::CreateConnPtr()
{
    HRESULT hr;
    _ConnectionPtr connPtr;
    hr = connPtr.CreateInstance(__uuidof(Connection));
    if (FAILED(hr) == TRUE)
    {
        return NULL;
    }
    return connPtr;
}

_CommandPtr CDBOperation::CreateCommPtr()
{
    HRESULT hr;
    _CommandPtr commPtr;
    hr = commPtr.CreateInstance(__uuidof(Command));
    if (FAILED(hr) == TRUE)
    {
        return NULL;
    }
    return commPtr;
}

_RecordsetPtr CDBOperation::CreateRecsetPtr()
{
    HRESULT hr;
    _RecordsetPtr recsetPtr;
    hr = recsetPtr.CreateInstance(__uuidof(Command));
    if (FAILED(hr) == TRUE)
    {
        return NULL;
    }
    return recsetPtr;
}

操作方法:

1.连接数据库

Data Source=你数据库实例的SID
然后是用户名和口令

    CDBOperation dbOper;//先实例化这个类,如果你在MFC中使用的话,建议写在CXXXDlg.h里
    _RecordsetPtr pRst;//记录集指针,标志查询结果等,同样建议写.h里
    //连接数据库
    bool bConn = dbOper.ConnToDB("Provider=OraOLEDB.Oracle;Persist Security Info=True;Data Source=orcl", "system", "system");
    if (false == bConn)
    {
        MessageBox("网络错误", "错误");
    }
    else {
        MessageBox("连接数据库成功", "成功");
    }

2.查询操作
先构造sql语句, 一般我用string, 因为string可以直接用+来拼接字符串,比如

string sql = "select * from ";
if (user == "strudent")//登录身份是学生用户
    sql += "student";  //sql = "select * from student";
else if (user == "teacher")
    sql += "teacher";  //sql = "select * from teacher";

然后使用CDBOperation类里的ExecuteWithResSQL(const char *)

    dbOper.ExecuteWithResSQL(sql.c_str());
    if (NULL == pRst)
    {
        MessageBox("查询数据出现错误!");
        return;
    }
    if (pRst->adoEOF)//记录为0
    {
        return;
    }
    _variant_t number, name, age;//这里是你表的属性, 查询时数据会读取到这些变量里
    while(!pRst->adoEOF)
    {
        pRst->MoveFirst(); //记录集指针移动到查询结果集的前面
        sno = pRst->GetCollect(_variant("SNO"));
        name = pRst->GetCollect(_variant("SNAME"));
        age = pRst->GetCollect(_variant("SAGE"));
        pRst->MoveNext();//移动到下一个元组
    }
    //GetCollect函数的参数是你表的相应属性名

3.插入/删除操作

    //使用string构造sql语句
    //插入
    string sql = "insert into student values('000001', '牛逼', '21');
    //删除
    string sql = "delete from student where sno = '000001';

    pRst = dbOper.ExecuteWithResSQL(sql.c_str());//直接调用这个函数即可
    if (NULL != pRst)
    {
        MessageBox(_T("添加成功\0"), 0, 0);
        showData();
        return;
    }
tips:先偷个懒, 有时间把CDBOperation类分析一下, 关于数据库创建也有一定要求, 回头补上

你可能感兴趣的:(oracle)