• MFC VC++ ADO方式连接SQL server 2008 R2数据库


    ADO (ActiveX Data Objects,ActiveX数据对象)是Microsoft提出的应用程序接口 API 用以实现访问关系或非关系数据库中的数据。

    ADO 是一项微软的技术

    ADO 指 ActiveX 数据对象(ActiveX Data Objects)

    ADO 是一个微软的 Active-X 组件

    ADO 会随微软的 IIS 被自动安装

    ADO 是一个访问数据库中数据的编程接口

    把ado的这个数据库操作封装成一个MFC DLL,目的是支持MFC中的类跟MFC配合起来方便

    参考 

    MFC DLL的创建和调用

     1 // ADODLL.h : ADODLL DLL 的主头文件
     2 //
     3 
     4 #pragma once
     5 
     6 #ifndef __AFXWIN_H__
     7 #error "在包含此文件之前包含“stdafx.h”以生成 PCH 文件"
     8 #endif
     9 
    10 #include "resource.h"        // 主符号
    11 
    12 
    13 // CADODLLApp
    14 // 有关此类实现的信息,请参阅 ADODLL.cpp
    15 //
    16 
    17 class CADODLLApp : public CWinApp
    18 {
    19 public:
    20     CADODLLApp();
    21 
    22     // 重写
    23 public:
    24     virtual BOOL InitInstance();
    25 
    26     DECLARE_MESSAGE_MAP()
    27 };
    28 
    29 
    30 //#import "C://Program Files//Common Files//System//ado//msado15.dll" no_namespace rename("EOF","adoEOF")rename("BOF","adoBOF")
    31 
    32 //这样写是因为上面那句有编译错误
    33 #pragma warning(disable:4146)
    34 #import "C:/Program Files/Common Files/System/ADO/msado15.dll" named_guids rename("EOF","adoEOF"), rename("BOF","adoBOF")
    35 #pragma warning(default:4146)
    36 using namespace ADODB;
    37 
    38 
    39 
    40 class __declspec(dllexport) ADOCOM;
    41 
    42 class ADOCOM  
    43 {    
    44     //定义方法    
    45 public:
    46     ADOCOM();
    47     virtual ~ADOCOM();
    48     void setConnectData(CString, CString, CString, CString);
    49     // 初始化—连接数据库
    50     BOOL OnInitADOCOM();
    51     // 执行查询
    52     _RecordsetPtr& GetRecordSet(_bstr_t bstrSQL);
    53     // 执行SQL语句,Insert Update _variant_t
    54     BOOL ExecuteSQL(_bstr_t bstrSQL);
    55     //获取某个表的所有字段名
    56     //strTableName  --- 表名
    57     //columnNamesArray -- 存放字段名的字符串(CString类型)数组
    58     void GetAllColumnNames(CString strTableName);
    59     //判断某个表是否存在该字段。
    60     //Parameters:
    61     //strTablename -- 表名
    62     //strcolumnName -- 字段名
    63     BOOL IsExistColumn(CString strTableName,CString strcolumnName);
    64     //判断数据库中是否存在某个标
    65     //Parameters:
    66     //strTableName---表名
    67     BOOL IsExistTable(CString strTableName);
    68 
    69     //获取数据库中的所有表名
    70     //TableNamesArray -- 存放表名的字符串(CString类型)数组
    71     void GetAllTableNames();
    72 
    73     //断开连接
    74     void ExitConnect();
    75 
    76     // 定义变量
    77 public:
    78     //添加一个指向Connection对象的指针:
    79     _ConnectionPtr m_pConnection;
    80     //添加一个指向Recordset对象的指针:
    81     _RecordsetPtr m_pRecordset;
    82     CString m_strServer;
    83     CString m_strDatabase;
    84     CString m_strUserID;
    85     CString m_strPassword;
    86 
    87     CStringArray colNamesArray;
    88     CStringArray TableNamesArray;
    89 };
      1 // ADODLL.cpp : 定义 DLL 的初始化例程。
      2 //
      3 
      4 #include "stdafx.h"
      5 #include "ADODLL.h"
      6 
      7 #ifdef _DEBUG
      8 #define new DEBUG_NEW
      9 #endif
     10 
     11 //
     12 //TODO: 如果此 DLL 相对于 MFC DLL 是动态链接的,
     13 //        则从此 DLL 导出的任何调入
     14 //        MFC 的函数必须将 AFX_MANAGE_STATE 宏添加到
     15 //        该函数的最前面。
     16 //
     17 //        例如:
     18 //
     19 //        extern "C" BOOL PASCAL EXPORT ExportedFunction()
     20 //        {
     21 //            AFX_MANAGE_STATE(AfxGetStaticModuleState());
     22 //            // 此处为普通函数体
     23 //        }
     24 //
     25 //        此宏先于任何 MFC 调用
     26 //        出现在每个函数中十分重要。这意味着
     27 //        它必须作为函数中的第一个语句
     28 //        出现,甚至先于所有对象变量声明,
     29 //        这是因为它们的构造函数可能生成 MFC
     30 //        DLL 调用。
     31 //
     32 //        有关其他详细信息,
     33 //        请参阅 MFC 技术说明 33 和 58。
     34 //
     35 
     36 // CADODLLApp
     37 
     38 BEGIN_MESSAGE_MAP(CADODLLApp, CWinApp)
     39 END_MESSAGE_MAP()
     40 
     41 
     42 // CADODLLApp 构造
     43 
     44 CADODLLApp::CADODLLApp()
     45 {
     46     // TODO: 在此处添加构造代码,
     47     // 将所有重要的初始化放置在 InitInstance 中
     48 }
     49 
     50 
     51 // 唯一的一个 CADODLLApp 对象
     52 
     53 CADODLLApp theApp;
     54 
     55 
     56 // CADODLLApp 初始化
     57 
     58 BOOL CADODLLApp::InitInstance()
     59 {
     60     CWinApp::InitInstance();
     61 
     62     return TRUE;
     63 }
     64 
     65 
     66 
     67 
     68 ADOCOM::ADOCOM()
     69 {
     70     m_strServer = _T("192.168.58.129");
     71     m_strDatabase = _T("testserver");
     72     m_strUserID = _T("sa");
     73     m_strPassword = _T("123456");
     74     // 初始化OLE/COM库环境 
     75     ::CoInitialize(NULL);
     76 }
     77 
     78 ADOCOM::~ADOCOM()
     79 {
     80     // 释放环境
     81     ::CoUninitialize();
     82 }
     83 
     84 
     85 void ADOCOM::setConnectData(CString server, CString database, CString userid, CString password)
     86 {
     87     m_strServer = server;
     88     m_strDatabase = database;
     89     m_strUserID = userid;
     90     m_strPassword = password;
     91 }
     92 
     93 
     94 // 初始化—连接数据库
     95 BOOL ADOCOM::OnInitADOCOM()
     96 {
     97     try
     98     {
     99         // 创建Connection对象
    100         m_pConnection.CreateInstance("ADODB.Connection");
    101         //加这个东西好像没啥用
    102         //m_pConnection->ConnectionTimeout = 5;//设置连接超时时间
    103         //m_pConnection->CommandTimeout = 50;//设置执行命令超时时间
    104         //设置连接字符串
    105         CString sTemp;
    106         sTemp.Format(_T("Provider=SQLOLEDB.1; Server=%s; Database=%s; uid=%s;pwd=%s;"), m_strServer, m_strDatabase, m_strUserID, m_strPassword);
    107         _bstr_t strConnect = sTemp;
    108         m_pConnection->Open(strConnect, "", "", adModeUnknown);
    109         return TRUE;
    110     }
    111     // 捕捉异常
    112     catch(_com_error e)
    113     {
    114         // 显示错误信息s
    115         AfxMessageBox(e.ErrorMessage());
    116         return FALSE;
    117     }
    118 }
    119 
    120 // 执行查询
    121 _RecordsetPtr&  ADOCOM::GetRecordSet(_bstr_t bstrSQL)
    122 {
    123     try
    124     {
    125         // 连接数据库,如果Connection对象为空则结束查询
    126         if(m_pConnection == NULL)
    127         {
    128             m_pRecordset = NULL;
    129             return m_pRecordset;
    130         }
    131         // 创建记录集对象
    132         m_pRecordset.CreateInstance(__uuidof(Recordset));
    133         // 取得表中的记录
    134         m_pRecordset->Open(bstrSQL, m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);
    135     }
    136     // 捕捉异常
    137     catch(_com_error e)
    138     {
    139         // 显示错误信息
    140         AfxMessageBox(e.ErrorMessage());
    141         m_pRecordset = NULL;
    142         return m_pRecordset;
    143     }
    144     // 返回记录集
    145     return m_pRecordset;
    146 }
    147 
    148 // 执行SQL语句,Insert Update _variant_t
    149 BOOL ADOCOM::ExecuteSQL(_bstr_t bstrSQL)
    150 {
    151     try
    152     {
    153         // 是否已经连接数据库
    154         if(m_pConnection == NULL)
    155         {
    156             return FALSE;
    157         }
    158         // Connection对象的Execute方法:(_bstr_t CommandText, 
    159         // VARIANT * RecordsAffected, long Options ) 
    160         // 其中CommandText是命令字串,通常是SQL命令。
    161         // 参数RecordsAffected是操作完成后所影响的行数, 
    162         // 参数Options表示CommandText的类型:adCmdText-文本命令;adCmdTable-表名
    163         // adCmdProc-存储过程;adCmdUnknown-未知
    164         m_pConnection->Execute(bstrSQL, NULL, adCmdText);
    165         return TRUE;
    166     }
    167     catch(_com_error e)
    168     {
    169         AfxMessageBox(e.ErrorMessage());
    170         return FALSE;
    171     }
    172 }
    173 
    174 //获取某个表的所有字段名
    175 void ADOCOM::GetAllColumnNames(CString strTableName)
    176 {
    177     //CStringArray columnNamesArray;
    178     FieldPtr pField;
    179     CString strColName = _T("");
    180     CString strSql = _T("");
    181     _bstr_t vSQL = _T("");
    182     strSql.Format(_T("SELECT * FROM %s"), strTableName);
    183     vSQL = strSql;
    184     _RecordsetPtr pRecordset = GetRecordSet(vSQL);
    185     if (pRecordset == NULL)
    186     {
    187         colNamesArray.RemoveAll();
    188         return;
    189     }
    190     FieldsPtr pFields = pRecordset->GetFields();
    191     colNamesArray.RemoveAll();
    192     for (int i = 0;i < pFields->Count; i++)
    193     {
    194         pField = pFields->GetItem(long(i));
    195         strColName = (LPCTSTR)(_bstr_t)pField->Name;
    196         colNamesArray.Add(strColName);
    197     }
    198 }
    199 
    200 //判断某个表是否存在该字段。
    201 //Parameters:
    202 //strTablename -- 表名
    203 //strcolumnName -- 字段名
    204 BOOL ADOCOM::IsExistColumn(CString strTableName, CString strcolumnName)
    205 {
    206     BOOL bReturn = FALSE;
    207     GetAllColumnNames(strTableName);
    208 
    209     for (int i = 0; i < colNamesArray.GetSize(); i++)
    210     {
    211         if (strcolumnName == colNamesArray.GetAt(i))
    212         {
    213             bReturn = TRUE;
    214             break;
    215         }
    216     }
    217     return bReturn;
    218 }
    219 
    220 //判断数据库中是否存在某个表
    221 //Parameters:
    222 //strTableName---表名
    223 BOOL ADOCOM::IsExistTable(CString strTableName)
    224 {
    225     CString strSql;
    226     _bstr_t vSQL;
    227     strSql.Format(_T("select * from sysobjects where name='%s'"),strTableName);
    228     vSQL = strSql;
    229 
    230     _RecordsetPtr pRecordset = GetRecordSet(vSQL);
    231     if (!pRecordset->adoEOF)
    232     {
    233         return TRUE;
    234     }
    235     else
    236     {
    237         return FALSE;
    238     }    
    239 }
    240 
    241 //获取数据库中的所有表名
    242 //TableNamesArray -- 存放表名的字符串(CString类型)数组
    243 void ADOCOM::GetAllTableNames()
    244 {
    245     CString strTableName;
    246     CString strSql;
    247     _bstr_t vSQL;
    248     strSql = "select * from sysobjects";
    249     vSQL = strSql;
    250     _RecordsetPtr pRecordset = GetRecordSet(vSQL);
    251     TableNamesArray.RemoveAll();
    252     while(!pRecordset->adoEOF)
    253     {
    254         strTableName = (LPCTSTR)(_bstr_t)pRecordset->GetCollect("name");
    255         TableNamesArray.Add(strTableName);
    256         pRecordset->MoveNext();
    257     }
    258 }
    259 
    260 
    261 void ADOCOM::ExitConnect()
    262 {
    263     // 关闭记录集和连接
    264     if (m_pRecordset != NULL)
    265     {
    266         m_pRecordset->Close();
    267         //m_pRecordset->Release(); //这里空和release都影响下次连接后查询
    268         //m_pRecordset = NULL;
    269     }
    270     if (m_pConnection->GetState() == adStateOpen)//这里释放要和连接对应
    271     {
    272         m_pConnection->Close();
    273     }
    274     if (m_pConnection)
    275     {
    276         m_pConnection.Release();
    277         m_pConnection = NULL;
    278     }
    279 }

    把.h文件和.lib加入到调用的工程 声明这个类的对象

     1     m_ado.setConnectData(m_strSqlServer, m_strSqlDatabase, m_strSqlUserName, m_strSqlPassword);
     2     BOOL bRet;
     3     bRet = m_ado.OnInitADOCOM();
     4     if (bRet)
     5     {
     6         //向表中插入一条数据
     7         CString strTemp;
     8         strTemp.Format(_T("insert into table(item1, item2, item3) values ('%s', '%d', '%d')"), 
     9             str, 0, 1);
    10         _bstr_t str_insert = strTemp;
    11         bRet = m_ado.ExecuteSQL(str_insert);
    12         m_ado.ExitConnect();
    13     }
    14     return bRet;
     1     m_ado.setConnectData(m_strSqlServer, m_strSqlDatabase, m_strSqlUserName, m_strSqlPassword);
     2     BOOL bRet;
     3     bRet = m_ado.OnInitADOCOM();
     4     if (bRet)
     5     {
     6         //查询数据库中是否有表table
     7         bRet = m_ado.IsExistTable(_T("table"));
     8         if (!bRet)
     9         {
    10             //如果不存在就创建表table
    11             _bstr_t str_CreateTable = 
    12             "CREATE TABLE table(item1 char(50) primary key, item2 int, item3 int, item4 int)";
    13             bRet = m_ado.ExecuteSQL(str_CreateTable);
    14         }
    15         m_ado.ExitConnect();
    16     }
    17     return bRet;
  • 相关阅读:
    SSH框架面试题
    创业起步?先收藏这份终极指南
    技术专题之-技术的概述
    技术专题之-技术概述的目录
    晶体管电路学习笔记
    转载 关于小波消失矩的理解
    关于射级跟随器中输出负载加重情况的理解
    小波分解和合成的simulink仿真
    小波变换工程实现原理总结
    小波变换的解释
  • 原文地址:https://www.cnblogs.com/ckrgd/p/14002254.html
Copyright © 2020-2023  润新知