自己写的通过ADO操作mysql数据库
#include <iostream> #include <windows.h> #include <atlstr.h> #import "c:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF") rename("BOF","adoBOF") class ADOConn { // 定义变量 public: //添加一个指向Connection对象的指针: _ConnectionPtr m_pConnection; //添加一个指向Recordset对象的指针: _RecordsetPtr m_pRecordset; // 定义方法 public: ADOConn() { } virtual ~ADOConn() { } // 初始化—连接数据库 void OnInitADOConn() { // 初始化OLE/COM库环境 ::CoInitialize(NULL); HRESULT hr; try { // 创建Connection对象 hr = m_pConnection.CreateInstance("ADODB.Connection"); if(SUCCEEDED(hr)) { m_pConnection->ConnectionTimeout=600;//设置连接超时时间 m_pConnection->CommandTimeout=120;//设置执行命令超时时间
//DSN就是数据源名称 m_pConnection->Open("DSN=test; Server=localhost; Database=test", "root", "123456", adModeUnknown); } } // 捕捉异常 catch(_com_error e) { // 显示错误信息 std::cerr << "open error" << e.Description() << std::endl; //AfxMessageBox(e.Description()); } } // 执行查询 _RecordsetPtr& GetRecordSet(_bstr_t bstrSQL) { try { // 连接数据库,如果Connection对象为空,则重新连接数据库 if(m_pConnection==NULL) OnInitADOConn(); // 创建记录集对象 m_pRecordset.CreateInstance(__uuidof(Recordset)); // 取得表中的记录 /* Open 方法的原型是这样的:HRESULT Recordset15::Open ( const _variant_t & Source, const _variant_t & ActiveConnection, enum CursorTypeEnum CursorType, enum LockTypeEnum LockType, long Options ) ①Source 是数据查询字符串 ②ActiveConnection是已经建立好的连接(我们需要用Connection对象指针来构造一个 _variant_t对象) ③CursorType光标类型,它可以是以下值之一,请看这个枚举结构: enum CursorTypeEnum { adOpenUnspecified = -1,///不作特别指定 adOpenForwardOnly = 0,///前滚静态光标。这种光标只能向前浏览记录集,比如用MoveNext向前滚动,这种方式可以提高浏览速度。但诸如 BookMark,RecordCount,AbsolutePosition,AbsolutePage都不能使用 adOpenKeyset = 1,///采用这种光标的记录集看不到其它用户的新增、删除操作,但对于更新原有记录的操作对你是可见的。 adOpenDynamic = 2,///动态光标。所有数据库的操作都会立即在各用户记录集上反应出来。 adOpenStatic = 3///静态光标。它为你的记录集产生一个静态备份,但其它用户的新增、删除、更新操作对你的记录集来说是不可见的。 }; ④LockType锁定类 型,它可以是以下值之一,请看如下枚举结构: enum LockTypeEnum { adLockUnspecified = -1,///未指定 adLockReadOnly = 1,///只读记录集 adLockPessimistic = 2,悲观锁定方式。数据在更新时锁定其它所有动作,这是最安全的锁定机制 adLockOptimistic = 3,乐观锁定方式。只有在你调用Update方法时才锁定记录。在此之前仍然可以做数据的更新、插入、删除等动作 adLockBatchOptimistic = 4,乐观分批更新。编辑时记录不会锁定,更改、插入及删除是在批处理模式下完成。 }; */ m_pRecordset->Open(bstrSQL, m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText); } // 捕捉异常 catch(_com_error e) { // 显示错误信息 std::cerr << "get error" << e.Description() << std::endl; //AfxMessageBox(e.Description()); } // 返回记录集 return m_pRecordset; } // 执行SQL语句,Insert Update _variant_t BOOL ExecuteSQL(_bstr_t bstrSQL) { try { // 是否已经连接数据库 if(m_pConnection == NULL) OnInitADOConn(); // Connection对象的Execute方法:(_bstr_t CommandText, VARIANT * RecordsAffected, long Options ) // 其中CommandText是命令字串,通常是SQL命令。 // 参数RecordsAffected是操作完成后所影响的行数, // 参数Options表示CommandText的类型:adCmdText-文本命令;adCmdTable-表名 adCmdProc-存储过程;adCmdUnknown-未知 m_pConnection->Execute(bstrSQL, NULL, adCmdText); return true; } catch(_com_error e) { std::cerr << "execute error" << e.Description() << std::endl; //AfxMessageBox(e.Description()); return false; } } void ExitConnect() { // 关闭记录集和连接 if (m_pRecordset != NULL) m_pRecordset->Close(); if(m_pConnection != NULL) m_pConnection->Close(); // 释放环境 ::CoUninitialize(); } }; int main() { int i; ADOConn m_ADO; m_ADO.OnInitADOConn(); //设置SELECT语句 _bstr_t vSQL; vSQL = "SELECT * FROM test where id = 2"; //执行SELETE语句 _RecordsetPtr m_pRecordset; m_pRecordset = m_ADO.GetRecordSet(vSQL); CString name0; //返回各列的值 while (!m_pRecordset->adoEOF) { name0 = (LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("name"); printf("name : %s\n", (CT2A)name0); std::cerr << "success " << (CT2A)name0 << std::endl; m_pRecordset->MoveNext(); } //设置INSERT语句 /* _bstr_t vInserSQL; vInserSQL = "insert into test values(3, 'cc')"; //执行INSERT语句 if (m_ADO.ExecuteSQL(vInserSQL)) { printf("Insert Data Successful!!!\n"); } */ /* //设置UPDATE语句 _bstr_t vUpdateSQL; vUpdateSQL = "update test set name = '开发' where id = 3"; //执行INSERT语句 if (m_ADO.ExecuteSQL(vUpdateSQL)) { printf("Update Data Successful!!!\n"); } */ /* //设置UPDATE语句 _bstr_t vDeleteSQL; vDeleteSQL = "delete from test where id = 3"; //执行INSERT语句 if (m_ADO.ExecuteSQL(vDeleteSQL)) { printf("Delete Data Successful!!!\n"); } */ //断开与数据库的连接 m_ADO.ExitConnect(); std::cin >> i; return 0; }