本文详细介绍了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()
-
- {
-
-
-
- ::CoInitialize(NULL);
-
-
-
- try
-
- {
-
-
-
- m_pConnection.CreateInstance("ADODB.Connection");
-
-
-
- _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());
-
- }
-
- }
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
-
- {
-
-
-
- m_pConnection.CreateInstance("ADODB.Connection");
-
-
-
- _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());
-
- }
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
-
- {
-
-
-
- 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;
-
- }
_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 执行存储过程
- bool CICSC_ACD::BeginService_DB(const char * cClientId, char * cAgentId)
-
- {
-
-
-
- _CommandPtr pCommand;
-
-
-
- pCommand.CreateInstance(__uuidof(Command));
-
- pCommand->ActiveConnection=m_pConnection;
-
- pCommand->CommandType=adCmdStoredProc;
-
- _ParameterPtr Customer,Agent;
-
- pCommand->CommandText=_bstr_t("BeginService");
-
-
-
-
-
- Customer = pCommand->CreateParameter(_bstr_t("@w_c_id"),adVarChar,adParamInput,15, _bstr_t(cClientId));
-
- pCommand->Parameters->Append(Customer);
-
-
-
- Agent = pCommand->CreateParameter(_bstr_t("@w_emp_id"),adVarChar,adParamInput,15, _bstr_t(cAgentId));
-
- pCommand->Parameters->Append(Agent);
-
-
-
- pCommand->Execute(NULL, NULL, adCmdStoredProc);
-
- if (pCommand!=NULL)
-
- {
-
- pCommand.Detach();
-
- }
-
- return true;
-
- }
bool CICSC_ACD::BeginService_DB(const char * cClientId, char * cAgentId) { // 服务开始 _CommandPtr pCommand;// = new _CommandPtr; pCommand.CreateInstance(__uuidof(Command)); pCommand->ActiveConnection=m_pConnection; pCommand->CommandType=adCmdStoredProc; _ParameterPtr Customer,Agent; pCommand->CommandText=_bstr_t("BeginService"); // pCommand->Parameters->Append(pCommand->CreateParameter(_bstr_t("@RETURN_VALUE"), adInteger, adParamReturnValue, 0)); Customer = pCommand->CreateParameter(_bstr_t("@w_c_id"),adVarChar,adParamInput,15, _bstr_t(cClientId)); pCommand->Parameters->Append(Customer); Agent = pCommand->CreateParameter(_bstr_t("@w_emp_id"),adVarChar,adParamInput,15, _bstr_t(cAgentId)); pCommand->Parameters->Append(Agent); pCommand->Execute(NULL, NULL, adCmdStoredProc); if (pCommand!=NULL) { pCommand.Detach(); } return true; }
- _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);