CMFCADO类

Wesley13
• 阅读 557

自己简单封装的ado.路径那个还没改。。CMFCADO类

使用方法如下

#include "MFCADO.h"  
  
void test_query(CMFCADO& c)  
{  
  
    if(c.GetRecordSet("select * from reward"))  
    {  
        while( RS_NOT_EOF(c.m_pRS) )  
        {  
  
            printf("%s   %d  \n ",    RS_GET_STR(c.m_pRS,"name") , RS_GET_INT(c.m_pRS,"money")  );  
  
            RS_MOVE_NEXT(c.m_pRS);  
        }  
    }  
}  
  
int _tmain(int argc, _TCHAR* argv[])  
{  
    CMFCADO c;  
    if(c.OpenConn("")){  
        printf("OpenConn ok\n");  
    }  
  
  
//c.ExecuteSQL("insert into reward (name,money)values('xx',10000)");  
  
    while(1)  
    {  
        test_query(c);  
    }  
   
  
    Sleep(1000);  
  
  
    return 0;  
}  

CMFCADO.h

#pragma once


#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF") rename("BOF", "adoBOF") 

#define RS_NOT_EOF(rs) !rs->adoEOF
#define RS_GET_STR(rs,colname)  (char*)(_bstr_t)rs->GetCollect(colname)
#define RS_GET_INT(rs,colname)  atoi((char*)(_bstr_t)rs->GetCollect(colname))

#define RS_MOVE_NEXT(rs) rs->MoveNext();

/************************************************************************/
/* 

mfc ado

CMFCADO c;
if(c.OpenConn("")){
   printf("OpenConn ok");
}

c.ExecuteSQL("insert into table (x,b)values(7,10000)");



simawei@qq.com        
2012.8.1


*/
/************************************************************************/

class CMFCADO
{
public:
    CMFCADO(void);
    ~CMFCADO(void);

    //通过文件路径打开mdb数据库
    bool OpenConn(LPCTSTR mdb_filepath);

    void CloseConn();

    bool  CMFCADO::GetRecordSet(LPCTSTR bstrSQL);

    bool CMFCADO::ExecuteSQL(LPCTSTR  bstrSQL);
 
    void CloseRecordset(void);

    _RecordsetPtr m_pRS;//添加一个指向RecordSet对象的指针

private:


    _ConnectionPtr m_pConnection;//添加一个指向Connection对象的指针

};
 

CMFCADO.cpp

#include "StdAfx.h"
#include ".\mfcado.h"

CMFCADO::CMFCADO(void)
{
  
    ::CoInitialize(NULL);//初始化OLE/COM库环境


 
}

CMFCADO::~CMFCADO(void)
{
    CloseConn();

     ::CoUninitialize();  

}
void CMFCADO::CloseConn()
{
    try
    {
        if ( m_pConnection!=NULL  )    
        {
            m_pConnection->Close();
            m_pConnection=NULL;
        }
    }
    catch(_com_error &e)
    {
        //printf("CADO::Close()  exception: %s\n",(char*)e.Description());//显示错误信息
    }
}

bool CMFCADO::OpenConn(LPCTSTR mdb_filepath)
{
    //m_pConnection.CreateInstance(_uuidof(Connection));
 
    //创建Connection 对象
    m_pConnection.CreateInstance("ADODB.Connection"); 

    try
    {     
        HRESULT hr=m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=x.mdb","","",adModeUnknown);
        if (FAILED(hr))
        {
            m_pConnection=NULL;

            printf("Connection->Open FAILED\n");
        }
    
    }
    catch(_com_error e)
    {
        //AfxMessageBox( (char*)e.Description() );//显示错误信息);
        printf("[%s] err [%s]\n",__FUNCTION__,(char*)e.Description());
        return false;
    }

    return true;

}

bool CMFCADO::ExecuteSQL(LPCTSTR  bstrSQL)
{
    _variant_t vRowsAffected;

    try
    {
        m_pConnection->Execute(bstrSQL,&vRowsAffected,adCmdText);

        //vRowsAffected.intVal;
    }
    catch (_com_error e)
    {
        printf("[%s] err [%s]\n",__FUNCTION__,(char*)e.Description());
        return false;
    }
     
    return  true;
}
void CMFCADO::CloseRecordset(void)  
{  
    if(m_pRS !=NULL )  
    {    
        m_pRS->Close();
        m_pRS=NULL;
    }
}  

bool  CMFCADO::GetRecordSet(LPCTSTR bstrSQL)
{
    CloseRecordset();

    //Log(MSG_SQL,"Query [%s]\n",bstrSQL);

    //m_pRecordset.CreateInstance(__uuidof(Recordset));
    
    //创建记录集对象
    m_pRS.CreateInstance("ADODB.Recordset");

    try
    {
        /*
        lockType 表示当打开记录集时,数据提供者用于锁定数据库的类型: 
            adLockReadOnly 数据不能改变,这是缺省值! 
            adLockPessimistic 数据提供者在开始编辑数据的时候锁定记录 
            adLockOptimistic 仅当调用update方法时,数据提供者锁定记录 
            adLockBatchOptimistic 用于批处理修改 
            他们的常量值定义分别是: 
            adLockReadOnly = 1 
            adLockPessimistic = 2 
            adLockOptimistic = 3 
            adLockBatchOptimistic = 4*/

        //取得表中的记录
        HRESULT hr=    m_pRS->Open(bstrSQL,
                m_pConnection.GetInterfacePtr(),  // 获取库接库的IDispatch指针 ,
                adOpenDynamic,
                adLockReadOnly, //,adLockBatchOptimistic    adLockOptimistic
                adCmdText);
        if (FAILED(hr))
        {
            m_pRS=NULL;
        }else{
            
        }
    }
    catch (_com_error e)
    {
        printf("[%s] err [%s]\n",__FUNCTION__,(char*)e.Description());
        return false;
    } 

    return true;
}
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
2个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
2年前
java——20171121
!(http://a.51jsoft.com/uploads/default/original/1X/c542896b094a42a5653fb75adf6cdacd6e35d12e.png)!(https://static.oschina.net/uploads/space/2017/1121/210719_G80Z_3715033.png)
Wesley13 Wesley13
2年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Wesley13 Wesley13
2年前
mysql select将多个字段横向合拼到一个字段
表模式:CREATE TABLE tbl_user (  id int(11) NOT NULL AUTO_INCREMENT,  name varchar(255) DEFAULT NULL,  age int(11) DEFAULT NULL,  PRIMARY KEY (id)
Wesley13 Wesley13
2年前
35岁是技术人的天花板吗?
35岁是技术人的天花板吗?我非常不认同“35岁现象”,人类没有那么脆弱,人类的智力不会说是35岁之后就停止发展,更不是说35岁之后就没有机会了。马云35岁还在教书,任正非35岁还在工厂上班。为什么技术人员到35岁就应该退役了呢?所以35岁根本就不是一个问题,我今年已经37岁了,我发现我才刚刚找到自己的节奏,刚刚上路。
Python进阶者 Python进阶者
8个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这