ADO (ActiveX Data Objects,ActiveX数据对象)是Microsoft提出的应用程序接口 API 用以实现访问关系或非关系数据库中的数据。
ADO 是一项微软的技术
ADO 指 ActiveX 数据对象(ActiveX Data Objects)
ADO 是一个微软的 Active-X 组件
ADO 会随微软的 IIS 被自动安装
ADO 是一个访问数据库中数据的编程接口
把ado的这个数据库操作封装成一个MFC DLL,目的是支持MFC中的类跟MFC配合起来方便
参考
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;