Windows下C++访问数据库(ADO)

  • C++利用ADO访问数据库还是比较方便的,我参考网上其它资料,把封装ADO到一个类中,这样调用起来会更加的方便
  • 这个类单线程访问数据库没有问题,提供了查询、增加、删除和修改的接口。
  • 并行访问的话会有问题,另外不能频繁更新数据库,因为更新操作是要访外存的,它和程序后续工作是异步进行的。这里的问题我也会在今后继续完善。
//DBAssistant.h
#pragma once
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")
#include <string>
using namespace std;

class DBAssistant
{
public:
    DBAssistant();
    ~DBAssistant();
protected:
    //数据库连接指针
    _ConnectionPtr m_pConnection;
    _RecordsetPtr m_pResultset;

public:
    bool IsFirstRecord; //是否是第一条记录
    //bool IsPrepareStatment; //是否是插入记录状态
public:
    //连接数据库
    bool OpenConnect(_bstr_t url);

    //数据库查询
    // 根据sql查询
    bool ExecuteQuery(_bstr_t sql);
    //结果指针前进一位
    bool Next();
    // 获取记录总数,如果发生异常返回-1
    int GetRecordCount();
    // 获取某个域的字符串
    _bstr_t GetString(const _bstr_t fieldname);
    string GetString(int index);
    string GetString(const char* filedname);

    //删除
    //删除当前记录
    bool DelOne();
    //删除全部查询出的记录
    bool DelAll();

    //增加和修改
    bool ExecuteAddNew();
    bool SetFieldValue(int nIndex, _variant_t fieldValue);
    bool SetFieldValue(const char* FieldName, _variant_t fieldValue);
    bool ExecuteUpdate();

    //关闭
    bool CloseRecordSet();
    bool CloseConnection();


};
//DBAssitant.cpp
#include "stdafx.h"
#include "DBAssistant.h"
#include <iostream>
using namespace std;


DBAssistant::DBAssistant()
{
    IsFirstRecord = true;
    //IsPrepareStatment = false;
    CoInitialize(NULL);
    m_pConnection = NULL;
}


DBAssistant::~DBAssistant()
{
    IsFirstRecord = false;
    CloseRecordSet();
    CloseConnection();
}

bool DBAssistant::OpenConnect(_bstr_t url){
    if (m_pConnection != NULL && m_pConnection->State) //如果已经打开,直接返回
        return true;

    try {
        HRESULT hr = m_pConnection.CreateInstance(__uuidof(Connection));
        if (FAILED(hr))
        {
            puts("_ConnectionPtr对象指针实例化失败!");
        }
        _bstr_t connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+ url +";Persist Security Info=True";
        m_pConnection->Open(connStr, "", "", adModeUnknown);
    }
    catch (_com_error e) {
        puts("数据库连接失败,确认数据库配置正确!");
        return false;
    }
    return true;
}
bool DBAssistant::CloseRecordSet() {
    try {
        if (m_pResultset != NULL && m_pResultset->State != adStateClosed) {
            m_pResultset->Close();
            m_pResultset.Release();
        }
    }
    catch (_com_error e) {
        return false;
    }
    return true;
}

bool DBAssistant::CloseConnection() {
    try {
        if (m_pConnection->State != adStateClosed) {
            m_pConnection->Close();
            m_pConnection.Release();
        }
    }
    catch (_com_error e) {
        return false;
    }
    return true;
}

// 根据sql查询
bool DBAssistant::ExecuteQuery(_bstr_t sql)
{
    //cout << sql << endl;
    try {

        m_pResultset.CreateInstance(__uuidof(Recordset));
        m_pResultset->Open(sql, m_pConnection->GetConnectionString(), adOpenStatic, adLockOptimistic, adCmdText);
        //查询为空
        if (m_pResultset->adoEOF) {
            m_pResultset->Close();
            m_pResultset.Release();
            return false;
        }
        IsFirstRecord = true;
    }
    catch (_com_error e) {
        //cout << "查询出错:" << e.ErrorMessage() << endl;
        return false;
    }
    return true;
}


// //结果指针前进一位
bool DBAssistant::Next()
{
    try {
        if (m_pResultset->adoEOF) {
            return false;
        }
        if (IsFirstRecord) {
            IsFirstRecord = false;
        }
        else {
            m_pResultset->MoveNext();
            if (m_pResultset->adoEOF) //加上判断,移到下一条之后,是否是adoEOF
                return false;
        }
    }
    catch (_com_error e) {
        cout << "Next出错:" << e.ErrorMessage() << endl;
        return false;
    }
    return true;
}

// 获取记录总数
int DBAssistant::GetRecordCount()
{
    try {
        _variant_t fieldvalue = m_pResultset->GetRecordCount();
        return fieldvalue.intVal;
    }
    catch (_com_error e) {
        cout << "统计记录数出错:"<<e.ErrorMessage() << endl;
        return -1;
    }
    return 0;
}

// 获取某个域的字符串
_bstr_t DBAssistant::GetString(_bstr_t fieldname) {
    try {
        _variant_t fieldvalue = m_pResultset->GetCollect(fieldname);
        if (fieldvalue.vt == VT_NULL)
            return "";  //如果=NULL,则直接转换为""
        return fieldvalue;
    }
    catch (_com_error e) {
        cout << "获取域值出错:" << e.ErrorMessage() << endl;
    }
    return "";
}

string DBAssistant::GetString(const char* filedname){
    return _com_util::ConvertBSTRToString(GetString((_bstr_t)filedname));
}

string DBAssistant::GetString(int index){
    try {
        _variant_t fieldvalue = m_pResultset->GetCollect(_variant_t((long)index));
        if (fieldvalue.vt == VT_NULL)
            return "";  //如果=NULL,则直接转换为""
        return _com_util::ConvertBSTRToString((_bstr_t)fieldvalue);
    }
    catch (_com_error e) {
        cout << "用索引获取域值出错:" << e.Description() << endl;
    }
    return "";
}


//删除当前记录
bool DBAssistant::DelOne(){
    try{
        m_pResultset->Delete(adAffectCurrent);
    }
    catch (_com_error e){
        cout << "删除当前记录出错:" << e.ErrorMessage() << endl;
        return 0;
    }
    return 1;
}


//删除全部查询出的记录
bool DBAssistant::DelAll(){
    try{
        while (Next()){
            if(DelOne() == 0)
                return 0;
        }
    }
    catch (_com_error e){
        cout << "删除全部记录出错:" << e.ErrorMessage() << endl;
        return 0;
    }
    return 1;
}

bool DBAssistant::ExecuteAddNew() {
    try {
        m_pResultset->AddNew();
    }
    catch (_com_error e) {
        cout << "增加记录出错:" << e.ErrorMessage() << endl;
        return false;
    }
    return true;
}


bool DBAssistant::SetFieldValue(int nIndex, _variant_t fieldValue) {
    try {
        _variant_t vtIndex;
        vtIndex.vt = VT_I2;
        vtIndex.iVal = nIndex;
        m_pResultset->Fields->GetItem(vtIndex)->Value = fieldValue;
    }
    catch (_com_error e) {
        //cout << "设置记录出错:" << e.ErrorMessage() << endl;
        return false;
    }
    return true;
}

bool DBAssistant::SetFieldValue(const char* FieldName, _variant_t fieldValue) {
    try {
        m_pResultset->Fields->GetItem(FieldName)->Value = fieldValue;
    }
    catch (_com_error e) {
        //cout << "设置记录出错:" << e.ErrorMessage() << endl;
        return false;
    }
    return true;
}

bool DBAssistant::ExecuteUpdate() {
    try {
        m_pResultset->Update();
    }
    catch (_com_error e) {
        cout << "更新记录出错:" << e.ErrorMessage() << endl;
        return false;
    }
    return true;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值