ADO (ActiveX Data Objects,ActiveX数据对象)是Microsoft提出的应用程序接口 API 用以实现访问关系或非关系数据库中的数据。
ADO 是一项微软的技术
ADO 指 ActiveX 数据对象(ActiveX Data Objects)
ADO 是一个微软的 Active-X 组件
ADO 会随微软的 IIS 被自动安装
ADO 是一个访问数据库中数据的编程接口
1 //放在.h文件中例如 stdafx.h 2 //#import "C://Program Files//Common Files//System//ado//msado15.dll" no_namespace rename("EOF","adoEOF")rename("BOF","adoBOF") 3 4 //这样写是因为上面那句有编译错误 5 #pragma warning(disable:4146) 6 #import "C:/Program Files/Common Files/System/ADO/msado15.dll" named_guids rename("EOF","adoEOF"), rename("BOF","adoBOF") 7 #pragma warning(default:4146) 8 using namespace ADODB; 9 10 //添加一个指向Connection对象的指针 11 _ConnectionPtr m_pConnection; 12 //添加一个指向Recordset对象的指针 13 _RecordsetPtr m_pRecordset;
1 // 初始化—连接数据库 2 bool InitADOCOM() 3 { 4 // 初始化OLE/COM库环境 5 ::CoInitialize(NULL); 6 try 7 { 8 // 创建Connection对象 9 m_pConnection.CreateInstance("ADODB.Connection"); 10 // 设置连接字符串,必须是BSTR型或者_bstr_t类型 11 CString sTemp; 12 //数据库IP 数据库名字 登录ID 登录密码 13 sTemp.Format(_T("Provider=SQLOLEDB.1; Server=%s;Database=%s; uid=%s;pwd=%s;"), m_strServer, m_strDatabase, m_strUserID, m_strPassword); 14 _bstr_t strConnect = sTemp; 15 m_pConnection->Open(strConnect, "", "", adModeUnknown); 16 return TRUE; 17 } 18 // 捕捉异常 19 catch(_com_error e) 20 { 21 // 显示错误信息 22 AfxMessageBox(e.Description()); 23 return FALSE; 24 } 25 }
1 //调用 2 BOOL bRet; 3 bRet = InitADOCOM(); 4 if(bRet) 5 { 6 MessageBox(_T("数据库连接成功")); 7 } 8 else 9 { 10 MessageBox(_T("数据库连接失败")); 11 }
1 //执行查询 2 _RecordsetPtr& GetRecordSet(_bstr_t bstrSQL) 3 { 4 try 5 { 6 //重新连接数据库 7 if(m_pConnection->GetState() != adStateOpen) 8 { 9 OnInitADOCOM(); 10 } 11 //创建记录集对象 12 m_pRecordset.CreateInstance(__uuidof(Recordset)); 13 //取得表中的记录 14 m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic, adLockOptimistic, adCmdText); 15 } 16 // 捕捉异常 17 catch(_com_error e) 18 { 19 // 显示错误信息 20 AfxMessageBox(e.Description()); 21 } 22 // 返回记录集 23 return m_pRecordset; 24 }
1 _bstr_t strSelect = "select * from testTable"; 2 GetRecordSet(strSelect); 3 CString qqqq, q123; 4 while (!m_pRecordset->adoEOF) 5 { 6 qqqq = (_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("qwer"))->Value);//字段名 7 q123 = (_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("q123"))->Value);//字段名 8 //MessageBox(qqqq); 9 //MessageBox(q123); 10 m_pRecordset->MoveNext(); 11 }
1 //查询并取出数据 2 void select() 3 { 4 // TODO: 在此添加控件通知处理程序代码 5 try 6 { 7 m_pRecordset.CreateInstance("ADODB.Recordset"); 8 m_pRecordset->Open("select * from testTable", 9 _variant_t((IDispatch*)m_pConnection, true), adOpenStatic, adLockOptimistic, adCmdText); 10 } 11 catch (_com_error &e) 12 { 13 AfxMessageBox(e.Description()); 14 } 15 try 16 { 17 CString strCol1, strCol2; 18 while (!m_pRecordset->adoEOF) 19 { 20 //按照行来循环,取每个字段的数据 21 strCol1 = (_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("qwer"))->Value); 22 strCol2 = (_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("q123"))->Value); 23 m_pRecordset->MoveNext(); 24 } 25 } 26 catch (_com_error &e) 27 { 28 AfxMessageBox(e.Description()); 29 } 30 }
1 // 执行SQL语句 2 BOOL ExecuteSQL(_bstr_t bstrSQL) 3 { 4 try 5 { 6 //重新连接数据库 7 if(m_pConnection->GetState() != adStateOpen) 8 { 9 OnInitADOCOM(); 10 } 11 // Connection对象的Execute方法:(_bstr_t CommandText, 12 // VARIANT * RecordsAffected, long Options ) 13 // 其中CommandText是命令字串,通常是SQL命令。 14 // 参数RecordsAffected是操作完成后所影响的行数, 15 // 参数Options表示CommandText的类型:adCmdText-文本命令;adCmdTable-表名 16 // adCmdProc-存储过程;adCmdUnknown-未知 17 m_pConnection->Execute(bstrSQL, NULL, adCmdText); 18 return TRUE; 19 } 20 catch(_com_error e) 21 { 22 AfxMessageBox(e.Description()); 23 return FALSE; 24 } 25 }
_bstr_t strSQL = "delete from testTable where qwer = 'fred'";//不区分大小写 BOOL bRet = ExecuteSQL(strSQL); if(bRet) { MessageBox(_T("执行成功")); }else { MessageBox(_T("执行失败")); }
1 //获取某个表的所有字段名 2 void GetAllColumnNames(CString strTableName) 3 { 4 CStringArray columnNamesArray; 5 FieldPtr pField; 6 CString strColName = _T(""); 7 CString strSql = _T(""); 8 _bstr_t vSQL = _T(""); 9 strSql.Format(_T("SELECT * FROM %s"), strTableName); 10 vSQL = strSql; 11 //执行这个查询语句 12 _RecordsetPtr pRecordset = GetRecordSet(vSQL); 13 FieldsPtr pFields = pRecordset->GetFields(); 14 colNamesArray.RemoveAll(); 15 for (int i = 0;i < pFields->Count; i++) 16 { 17 pField = pFields->GetItem(long(i)); 18 strColName = (LPCTSTR)(_bstr_t)pField->Name; 19 columnNamesArray.Add(strColName); 20 } 21 }
1 //获取数据库中的所有表名 2 void GetAllTableNames() 3 { 4 CString strTableName; 5 CString strSql; 6 _bstr_t vSQL; 7 strSql = "select * from sysobjects"; 8 vSQL = strSql; 9 //执行这个查询语句 10 _RecordsetPtr pRecordset = GetRecordSet(vSQL); 11 CStringArray TableNamesArray; 12 while(!pRecordset->adoEOF) 13 { 14 strTableName = (LPCTSTR)(_bstr_t)pRecordset->GetCollect("name"); 15 TableNamesArray.Add(strTableName); 16 pRecordset->MoveNext(); 17 } 18 }
1 // 关闭记录集和连接 2 void ExitConnect() 3 { 4 if (m_pRecordset != NULL) 5 { 6 m_pRecordset->Close(); 7 m_pRecordset->Release(); 8 m_pRecordset = NULL; 9 } 10 if (m_pConnection->GetState() == adStateOpen) 11 { 12 m_pConnection->Close(); 13 } 14 if (m_pConnection != NULL) 15 { 16 m_pConnection.Release(); 17 m_pConnection = NULL; 18 } 19 // 释放环境 20 ::CoUninitialize(); 21 }
//不要多次关闭 ExitConnect();