先简单说说ADO(总结)。
在VC中使用ADO的开发步骤:
1,引入ADO库文件
在工程的stdafx.h里用#import引入ADO库文件。
#import "C:/Program Files/Common Files/System/ado/msado15.dll" no_namespace rename("BOF","adoBOF") rename("EOF","adoEOF")
2, 初始化COM环境
::CoInitialize(NULL); //初始化OLE/COM库环境
::CoUninitialize(); //关闭OLE/COM库环境,释放资源
AfxOleInit();//初始化OLE/COM库环境(MFC自带的)
3,使用ADO库的三个基本接口
ADO库包含三个基本接口:_ConnectionPtr接口、_RecordsetPtr接口和_CommandPtr接口。
其分别对应Connection对象(完成应用程序对数据源的访问连接)、Recordset对象(将查询的结果以记录集的方式存储)和Command对象(对已连接的数据源进行命令操作)。
定义对象并创建对象实例:
方法一:
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;
_CommandPtr m_pCommand;
m_pConnection.CreateInstance(__uuidof(Connection));
m_pRecordset.CreateInstance(__uuidof(Recordset));
m_pCommand.CreateInstance(__uuidof(Command));
方法二:
_ConnectionPtr m_pConnection("ADODB.Connection");
_RecordsetPtr m_pRecordset("ADODB.Recordset");
_CommandPtr m_pCommand("ADODN.Command");
方法三:
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;
_CommandPtr m_pCommand;
m_pConnection.CreateInstance("ADODB.Connection");
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pCommand.CreateInstance("ADODN.Command");
这三种方法都是一样的,关键看你喜好。
分别举例简单说明一下:
Connection对象:
_ConnectionPtr m_pConnection;
m_pConnection.CreateInstance(__uuidof(Connection));
try{
// 打开本地Access库ChatLog.mdb
m_pConnection->Open ("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=ChatLog.mdb","","",adModeUnknown);
//SQL Server连接方法
_bstr_t strConnect = "Provider=SQLOLEDB; Server=billgates;Database=HrMan; uid=sa; pwd=sa;";
m_pConnection->Open(strConnect,"","",adModeUnknown);
}
catch(_com_error e){
AfxMessageBox(e.Description());
}
Recordset对象:
_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance(__uuidof(Recordset));
CString sql;
sql.Format("SELECT DISTINCT name FROM table1");
try{
m_pRecordset->Open(sql.GetBuffer(sql.GetLength()),
_variant_t((IDispatch *)m_pConnection,true),
adOpenDynamic,
adLockOptimistic,
adCmdText);
}
catch(_com_error *e){
AfxMessageBox(e->ErrorMessage());
}
CString strName;
while (!m_pRecordset->adoEOF) {
strName.Format("%s",(char*)(_bstr_t)m_pRecordset->Fields->GetItem(_variant_t("Name"))->Value);
m_listbox.AddString(strName);
m_pRecordset->MoveNext();
}
Command对象:
_CommandPtr m_pCommand;
HRESULT hr = m_pCommand.CreateInstance(__uuidof(Command));
if(FAILED(hr))
{
AfxMessageBox("创建Command对象实例失败!");
}
CString strP_mailid;
_ParameterPtr param;
param=m_pCommand->CreateParameter("p_mailid",adVarChar,adParamOutput,strP_mailid.GetLength()+1,_variant_t(strP_mailid));
m_pCommand->Parameters->Append(param);
m_pCommand->ActiveConnection = m_pConnection;
m_pCommand->CommandType = adCmdStoredProc;
m_pCommand->CommandText = _bstr_t("P_MAIL_SEND");
try{
cmd->Execute(NULL,NULL,adCmdStoredProc);
}
catch (...) {
AfxMessageBox("调用存储过程P_MAIL_SEND有错!");
}
try{
strP_mailid = (char*)(_bstr_t)m_pCommand->Parameters->GetItem(_variant_t("p_mailid"))->GetValue();
}catch (...) {
strP_mailid = "";
}
m_pCommand.Detach();