VC用ADO访问数据库全面总结

 

注:文中参考了不少大虾的成果,先表示感谢!  

 本文详细介绍了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); 

 

差不多了,文章完毕

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值