C++使用ADO连接MySql数据库

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  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;
}

你可能感兴趣的:(c++自学笔记)