注:文中参考了不少大虾的成果,先表示感谢!
本文详细介绍了VC用ADO来访问数据库的各个对象及各方法。希望对大家有所帮助!!!
1、引入ADO库文件 使用ADO前必须在工程的stdafx.h头文件里用直接引入符号#import引入ADO库文件,以使编译器能正确编译。代码如下所示: 用#import引入ADO库文件
#import "c:/program files/common files/system/ado/msado15.dll"no_namespaces rename("EOF" adoEOF")
这行语句声明在工程中使用ADO,但不使用ADO的名字空间,并且为了避免常数冲突,将常数EOF改名为adoEOF。现在不需添加另外的头文件,就可以使用ADO接口了。 2、初始化OLE/COM库环境必须注意的是,ADO库是一组COM动态库,这意味应用程序在调用ADO前,必须初始化OLE/COM库环境。在MFC应用程序里,一个比较好的方法是在应用程序主类的InitInstance成员函数里初始化OLE/COM库环境。
void ADOConn::OnInitADOConn()
{
// 初始化OLE/COM库环境
::CoInitialize(NULL);
try
{
// 创建Connection对象
m_pConnection.CreateInstance("ADODB.Connection");
// 设置连接字符串,必须是BSTR型或者_bstr_t类型
_bstr_t strConnect = "Provider=SQLOLEDB; Server=CZ;Database=HrSys; uid=sa; pwd=sa;";
m_pConnection->Open(strConnect,"","",adModeUnknown);
}
// 捕捉异常
catch(_com_error e)
{
// 显示错误信息
AfxMessageBox(e.Description());
}
}
3、ADO接口简介 ADO库包含三个基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。 _ConnectionPtr接口返回一个记录集或一个空指针。通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。使用_ConnectionPtr接口返回一个记录集不是一个好的使用方法。对于要返回记录的操作通常用_RecordserPtr来实现。而用_ConnectionPtr操作时要想得到记录条数得遍历所有记录,而用_RecordserPtr时不需要。 _CommandPtr接口返回一个记录集。它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。在使用_CommandPtr接口时,你可以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。如果你只执行一次或几次数据访问操作,后者是比较好的选择。但如果你要频繁访问数据库,并要返回很多记录集,那么,你应该使用全局_ConnectionPtr接口创建一个数据连接,然后使用_CommandPtr接口执行存储过程和SQL语句。 _RecordsetPtr是一个记录集对象。与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定,游标控制等。同_CommandPtr接口一样,它不一定要使用一个已经创建的数据连接,可以用一个连接串代替连接指针赋给_RecordsetPtr的connection成员变量,让它自己创建数据连接。如果你要使用多个记录集,最好的方法是同Command对象一样使用已经创建了数据连接的全局_ConnectionPtr接口,然后使用_RecordsetPtr执行存储过程和SQL语句。
4、使用_ConnectionPtr接口 _ConnectionPtr主要是一个连接接口,取得与数据库的连接。它的连接字符串可以是自己直接写,也可以指向一个ODBC DSN。
5、使用_RecordsetPtr接口(以连接SQL Server为例)
try
{
// 创建Connection对象
m_pConnection.CreateInstance("ADODB.Connection");
// 设置连接字符串,必须是BSTR型或者_bstr_t类型
_bstr_t strConnect = "Provider=SQLOLEDB; Server=CZ;Database=HrSys; uid=sa; pwd=sa;";
m_pConnection->Open(strConnect,"","",adModeUnknown);
}
// 捕捉异常
catch(_com_error e)
{
// 显示错误信息
AfxMessageBox(e.Description());
}
_RecordsetPtr& ADOConn::GetRecordSet(_bstr_t bstrSQL)
{
try
{
// 连接数据库,如果Connection对象为空,则重新连接数据库
if(m_pConnection==NULL)
OnInitADOConn();
// 创建记录集对象
m_pRecordset.CreateInstance(__uuidof(Recordset));
// 取得表中的记录
m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}
// 捕捉异常
catch(_com_error e)
{
// 显示错误信息
AfxMessageBox(e.Description());
}
// 返回记录集
return m_pRecordset;
}
6、使用_CommandPtr接口 _CommandPtr接口返回一个Recordset对象,并且提供了更多的记录集控制功能,以下代码示例了使用_CommandPtr接口的方法:
I 执行存储过程
/**********************************************************************
* 函数名称: //CustomerQueue_DB()
* 功能描述: // 项表中写入客户进入客户列表并且开始排队的记录,
* 访问的表: //
* 修改的表: //T_WSP_ICSC_CustomerService
* 输入参数: //cClientId(客户id)
* 输出参数: // szBeginTime(客户进来排队时的时间)
* 返 回 值: // 是否成功
* 其它说明: // 操作数据库
* 修改日期 版本号 修改人 修改内容
* -----------------------------------------------
* 2008/06/02 V1.0 陈志 XXXX
***********************************************************************/
bool CICSC_ACD::CustomerQueue_DB(const char * cClientId, char * szBeginTime)
{
_CommandPtr pCommand;
//pCommand->CommandType=adCmdStoredProc;
pCommand.CreateInstance(__uuidof(Command));
pCommand->ActiveConnection=m_pConnection;//_ConnectionPtr对象
// 创建记录集对象
pCommand->CommandText=_bstr_t("GetTime");
pCommand->Parameters->Append(pCommand->CreateParameter(_bstr_t("@RETURN_VALUE"), adInteger, adParamReturnValue, 0));
_RecordsetPtr pRecordset = pCommand->Execute(NULL, NULL, adCmdStoredProc);
if (!pRecordset->adoEOF)
{
strcpy(szBeginTime, (char *)(_bstr_t)(pRecordset->Fields->GetItem(_variant_t("ServerTime"))->Value));
}
else
return false;
if (pRecordset!=NULL)
{
pRecordset->Close();
}
if (pCommand!=NULL)
{
pCommand.Detach();
}
_CommandPtr pCommand2;
pCommand2.CreateInstance(__uuidof(Command));
pCommand2->ActiveConnection=m_pConnection;//_ConnectionPtr对象
pCommand2->CommandText=_bstr_t("CustomerQueue"); //CustomerQueue
// pCommand2->Parameters->Append(pCommand2->CreateParameter(_bstr_t("@RETURN_VALUE"), adInteger, adParamReturnValue, 0));
pCommand2->Parameters->Append(pCommand2->CreateParameter(_bstr_t("@w_c_id"),adVarChar,adParamInput, 15, _bstr_t(cClientId)));
pCommand2->Parameters->Append(pCommand2->CreateParameter(_bstr_t("@BeginTime"),adVarChar,adParamInput, 20, _bstr_t(szBeginTime)));
try
{
pCommand2->Execute(NULL, NULL, adCmdStoredProc);
}
catch(...)
{
return false;
}
if (pCommand2!=NULL)
{
pCommand2.Detach();
}
return true;
}
II 执行一般的sql语句——使用_CommandPtr接口获取数据
_CommandPtr pCommand;
_RecordsetPtr pRs;
pCommand.CreateInstance(__uuidof(Command));
pCommand->ActiveConnection=pConn;
pCommand->CommandText="select * from student";
pCommand->CommandType=adCmdText;
pCommand->Parameters->Refresh();
pRs=pCommand->Execute(NULL,NULL,adCmdUnknown);
_variant_t varValue = pRs->GetCollect("name");
Cstring strValue=(char*)_bstr_t(varValue);
差不多了,文章完毕