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
#include
using std::string;
using std::vector;
struct _TESTRES
{
vector vec_CloName;
vector> 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 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;
}