1.数据库技术发展
ODBC->DAO->RDO->ADOOLE DB
2.ADO中包含了七个对象成员
Connection用于管理数据库的连接
Command包含sql命令
RecordSet用来存储数据操作返回的记录集
Error提供程序出错时的信息
Parameter用于管理基于参数化查询或存储过程的某个参数或变量信息
Field对象对应数据库表的字段
PropertyADO对象的定义特征或属性
3.ADO库的3个接口
_ConnectionPtr接口 返回一个记录集或一个空指针,通常用来连接数据库
_CommandPtr接口 返回一个记录集或执行sql返回记录集
_RecordsetPtr接口 是一个记录集对象,包含控制功能,锁定,游标等
例子代码:
ADOClass.h
#pragma once
//0.引入库
#import "C:\\Program Files (x86)\\Common Files\\System\\ado\\msado15.dll"no_namespace rename("EOF", "adoEOF")
#include <string>
#include <vector>
using std::string;
using std::vector;
struct _TESTRES
{
vector<string> vec_CloName;
vector<vector<string>> vec_Data;
};
class ADOClass
{
public:
ADOClass();
~ADOClass();
public:
//1.连接数据库
bool LinkDataBase(string server, string DBName, string UseName, string PassWord);
//2.发送SQL语句
bool ExeSqlByCmd(string sql);
//3.返回结果集
bool ExecSqlByRecordSet(_TESTRES& re, string sql);
private:
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordSet;
};
ADOClass.cpp
#include "stdafx.h" #include "ADOClass.h" ADOClass::ADOClass() { //初始化com组件 ::CoInitialize(NULL); m_pConnection.CreateInstance(_T("ADODB.Connection")); m_pRecordSet.CreateInstance(_T("ADODB.Recordset")); } ADOClass::~ADOClass() { if (m_pConnection) { try { //关闭数据库连接 HRESULT hr = m_pConnection->Close(); //关闭记录集 m_pRecordSet->Close(); //释放com组件 ::CoUninitialize(); } catch (_com_error e) { // AfxMessageBox(e.Description()); } } } bool ADOClass::LinkDataBase(string server, string DBName, string UseName, string PassWord) { try {
//使用sql.udl数据源文件,其中包括数据库连接字符串
//1.使用ODBC创建一个数据源,然后新建sql.udl文件,双击打开后选择连接选项卡,然后填写相关连接信息即可m_pConnection->Open(_bstr_t("FILE Name=sql.udl"),_bstr_t(""),_bstr_t(""),adConnectUnspecified);}catch (_com_error e){MessageBox(0, e.ErrorMessage(), 0, 0);return false;}return true;}bool ADOClass::ExeSqlByCmd(string sql){try{_variant_t Record;m_pConnection->Execute(_bstr_t(sql.c_str()),&Record, adCmdText);}catch (_com_error e){MessageBox(0, e.ErrorMessage(), 0, 0);return false;}return true;}bool ADOClass::ExecSqlByRecordSet(_TESTRES& tr, string sql){try{//打开记录集m_pRecordSet->Open(_bstr_t(sql.c_str()),m_pConnection.GetInterfacePtr(),adOpenStatic,adLockOptimistic,adCmdText);//取列名Fields *pFields = m_pRecordSet->GetFields();//获取字段数量long lCount = pFields->GetCount();if (lCount == 0){return false;}for (long i = 0; i < lCount; i++){//取出每个字段的名字FieldPtr pFieldPtr = pFields->GetItem(i);string colName = pFieldPtr->GetName();tr.vec_CloName.push_back(colName);}//读取数据while (!m_pRecordSet->GetadoEOF()){vector <string> itemelem;for (long i = 0; i < lCount; i++){//通过序号或字段获取当前行中的数据_variant_t value = m_pRecordSet->GetCollect(i);if (value.vt == VT_NULL){itemelem.push_back("");continue;}string str = _bstr_t(value);itemelem.push_back(str);}tr.vec_Data.push_back(itemelem);m_pRecordSet->MoveNext();}}catch (_com_error e){MessageBox(0, e.ErrorMessage(), 0, 0);return false;}return true;}DatabaseOperator.cpp
//测试
// DatabaseOperator.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "ADOClass.h" int _tmain(int argc, _TCHAR* argv[]) { ADOClass adoObj; //连接数据库 if (adoObj.LinkDataBase("localhost", "Test", "root", "123456")) { printf("数据库连接成功!\n"); } //执行sql语句 if (adoObj.ExeSqlByCmd("create table test(id int);")) { printf("执行命令成功!\n"); } //执行sql语句返回记录集 _TESTRES testRes = {}; adoObj.ExecSqlByRecordSet(testRes, "select * from test;"); for (int i = 0; i < testRes.vec_CloName.size(); i++) { printf("%s\t", testRes.vec_CloName[i].c_str()); } for (int i = 0; i < testRes.vec_Data.size(); i++) { for (int j = 0; j < testRes.vec_CloName.size(); j++) { printf("%s\t", testRes.vec_Data[i][j]); } } system("pause"); return 0; }