• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
thankgoodness
博客园    首页    新随笔    联系   管理    订阅  订阅

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

VC用ADO访问数据库全面总结(z)
2008年07月01日 星期二 03:29 P.M.

本文详细介绍了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库环境。

  1. void   ADOConn::OnInitADOConn()  
  2.   
  3. {  
  4.   
  5.     // 初始化OLE/COM库环境   
  6.   
  7.      ::CoInitialize(NULL);  
  8.   
  9.     
  10.   
  11.     try  
  12.   
  13.      {  
  14.   
  15.         // 创建Connection对象  
  16.   
  17.          m_pConnection.CreateInstance("ADODB.Connection");  
  18.   
  19.         // 设置连接字符串,必须是BSTR型或者_bstr_t类型  
  20.   
  21.          _bstr_t strConnect = "Provider=SQLOLEDB; Server=CZ;Database=HrSys; uid=sa; pwd=sa;";  
  22.   
  23.          m_pConnection->Open(strConnect,"","",adModeUnknown);  
  24.   
  25.      }  
  26.   
  27.     // 捕捉异常  
  28.   
  29.     catch(_com_error e)  
  30.   
  31.      {  
  32.   
  33.         // 显示错误信息  
  34.   
  35.          AfxMessageBox(e.Description());  
  36.   
  37.      }  
  38.   
  39. }  
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为例)

  1. try  
  2.   
  3.      {  
  4.   
  5.         // 创建Connection对象  
  6.   
  7.          m_pConnection.CreateInstance("ADODB.Connection");  
  8.   
  9.         // 设置连接字符串,必须是BSTR型或者_bstr_t类型  
  10.   
  11.          _bstr_t strConnect = "Provider=SQLOLEDB; Server=CZ;Database=HrSys; uid=sa; pwd=sa;";  
  12.   
  13.          m_pConnection->Open(strConnect,"","",adModeUnknown);  
  14.   
  15.      }  
  16.   
  17.     // 捕捉异常  
  18.   
  19.     catch(_com_error e)  
  20.   
  21.      {  
  22.   
  23.         // 显示错误信息  
  24.   
  25.          AfxMessageBox(e.Description());  
  26.   
  27.      }  
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());   }

  1. _RecordsetPtr&   ADOConn::GetRecordSet(_bstr_t bstrSQL)  
  2.   
  3. {  
  4.   
  5.     try  
  6.   
  7.      {  
  8.   
  9.         // 连接数据库,如果Connection对象为空,则重新连接数据库  
  10.   
  11.         if(m_pConnection==NULL)  
  12.   
  13.              OnInitADOConn();  
  14.   
  15.         // 创建记录集对象  
  16.   
  17.          m_pRecordset.CreateInstance(__uuidof(Recordset));  
  18.   
  19.         // 取得表中的记录  
  20.   
  21.          m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);  
  22.   
  23.      }  
  24.   
  25.     // 捕捉异常  
  26.   
  27.     catch(_com_error e)  
  28.   
  29.      {  
  30.   
  31.         // 显示错误信息  
  32.   
  33.          AfxMessageBox(e.Description());  
  34.   
  35.      }  
  36.   
  37.     // 返回记录集  
  38.   
  39.     return m_pRecordset;  
  40.   
  41. }  
_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 执行存储过程

  1. bool CICSC_ACD::BeginService_DB(const char * cClientId, char * cAgentId)  
  2.   
  3. {     
  4.   
  5.      // 服务开始  
  6.   
  7.       _CommandPtr pCommand;// = new _CommandPtr;  
  8.   
  9.        
  10.   
  11.       pCommand.CreateInstance(__uuidof(Command));  
  12.   
  13.       pCommand->ActiveConnection=m_pConnection;  
  14.   
  15.       pCommand->CommandType=adCmdStoredProc;   
  16.   
  17.       _ParameterPtr   Customer,Agent;  
  18.   
  19.       pCommand->CommandText=_bstr_t("BeginService");     
  20.   
  21.        
  22.   
  23. //    pCommand->Parameters->Append(pCommand->CreateParameter(_bstr_t("@RETURN_VALUE"), adInteger, adParamReturnValue, 0));  
  24.   
  25.       Customer = pCommand->CreateParameter(_bstr_t("@w_c_id"),adVarChar,adParamInput,15, _bstr_t(cClientId));  
  26.   
  27.       pCommand->Parameters->Append(Customer);  
  28.   
  29.        
  30.   
  31.       Agent = pCommand->CreateParameter(_bstr_t("@w_emp_id"),adVarChar,adParamInput,15, _bstr_t(cAgentId));  
  32.   
  33.       pCommand->Parameters->Append(Agent);  
  34.   
  35.   
  36.   
  37.       pCommand->Execute(NULL, NULL, adCmdStoredProc);  
  38.   
  39.      if (pCommand!=NULL)  
  40.   
  41.       {  
  42.   
  43.           pCommand.Detach();  
  44.   
  45.       }  
  46.   
  47.      return true;  
  48.   
  49. }  
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;   }

  1. _CommandPtr pCommand;  
  2.   
  3. _RecordsetPtr pRs;  
  4.   
  5. pCommand.CreateInstance(__uuidof(Command));  
  6.   
  7. pCommand->ActiveConnection=pConn;  
  8.   
  9. pCommand->CommandText="select * from student";  
  10.   
  11. pCommand->CommandType=adCmdText;  
  12.   
  13. pCommand->Parameters->Refresh();  
  14.   
  15. pRs=pCommand->Execute(NULL,NULL,adCmdUnknown);  
  16.   
  17. _variant_t varValue = pRs->GetCollect("name");  
  18.   
  19. Cstring strValue=(char*)_bstr_t(varValue);   
posted @ 2008-10-30 10:35  宇晨  阅读(399)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3