在Visual C++中用ADO进行数据库编程(上)

掌握ADO数据库编程操作 本文深入探讨了如何通过ADO(ActiveX Data Objects)和OLE DB在Visual C++中进行数据库操作。内容包括了如何更新记录集、添加新记录以及删除记录等关键数据库操作,并强调了在操作过程中使用Supports测试的重要性,以确保操作的顺利进行。同时,文章指出了ADO在数据库编程中的灵活性,以及其在不同开发平台间的可移植性。最后,文章通过实例代码片段,展示了如何使用ADO进行基本的数据库操作。 阅读详情

在Visual C++中用ADO进行数据库编程(上) 
      
  1. 生成应用程序框架并初始化OLE/COM库环境

  创建一个标准的MFC AppWizard(exe)应用程序,然后在使用ADO数据库的InitInstance函数中初始化OLE/COM库(因为ADO库是一个COM DLL库)。
本例为:

 BOOL CAdotestDlg::OnInitDialog()
 {
        ::CoInitialize(NULL); //初始化OLE/COM库环境
  }

  程序最后要调用 ::CoUninitialize();//释放程序占用的COM 资源。

  另外:

m_pRecordset->Close(); 注意!!!不要多次关闭!!!!!!!!!!!!
m_pConnection->Close();
m_pRecordset = NULL;
m_pConnection = NULL;
  2. 引入ADO库文件

  使用ADO前必须在工程的stdafx.h文件最后用直接引入符号#import引入ADO库文件,以使编译器能正确编译。代码如下:
#import "C:/Program Files/common files/system/ado/msado15.dll" no_namespace rename("EOF","adoEOF")
  ADO类的定义是作为一种资源存储在ADO DLL(msado15.dll)中,在其内部称为类型库。类型库描述了自治接口,以及C++使用的COM vtable接口。当使用#import指令时,在运行时Visual C++需要从ADO DLL中读取这个类型库,并以此创建一组C++头文件。这些头文件具有.tli 和.tlh扩展名,读者可以在项目的目录下找到这两个文件。在C++程序代码中调用的ADO类要在这些文件中定义。
    程序的第三行指示ADO对象不使用名称空间。在有些应用程序中,由于应用程序中的对象与ADO中的对象之间可能会出现命名冲突,所以有必要使用名称空间。如果要使用名称空间,则可把第三行程序修改为: rename_namespace("AdoNS")。第四行代码将ADO中的EOF(文件结束)更名为adoEOF,以避免与定义了自己的EOF的其他库冲突。

  3.利用智能指针进行数据库操作

  在CaboutDlg头文件中定义两个ADO智能指针类实例,并在对话框中加入一个ListCtrl。

 class CAdotestDlg : public CDialog
{
     _ConnectionPtr m_pConnection;
     _RecordsetPtr m_pRecordset;
   ClistCtrl m_List;
     ......
}    

  ADO库包含三个智能指针:_ConnectionPtr、_CommandPtr和_RecordsetPtr。

  _ConnectionPtr通常被用来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。
  _CommandPtr返回一个记录集。它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。在使用_CommandPtr接口时,可以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。  _RecordsetPtr是一个记录集对象。与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定、游标控制等。

  在使用ADO程序的事件响应中OnButton1加入以下代码:

void CAdotestDlg::OnButton1()
{
 m_List.ResetContent();
 m_pConnection.CreateInstance(_uuidof(Connection)); //初始化Connection指针
 m_pRecordset.CreateInstance(_uuidof(Recordset));//初始化Recordset指针
 try
 {
  m_pConnection->Open("DSN=ADOTest","","",0); //连接叫作ADOTest的ODBC数据源
  //注意:这是连接不需要用户ID或密码的open 函数
  // 否则形式为 ->Open("DSN=test;uid=sa;pwd=123;","","",0);
 
  // 执行SQL语句得到一个记录集把其指针赋值给m_pRecordset
  CString strSql="select * from middle";
  BSTR bstrSQL = strSql.AllocSysString();
  m_pRecordset->Open(bstrSQL,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText);
  //adOpenDynamic:动态 adLockOptimistic乐观封锁法 adCmdText:文本查询语句
  while(!m_pRecordset->adoEOF)//遍历所有记录
  {
   //取纪录字段值方式之一
   _variant_t TheValue; //VARIANT数据类型
   TheValue = m_pRecordset->GetCollect("BIG_NAME");//得到字段BIG_NAME的值
   if(TheValue.vt!=VT_NULL)
    m_List.AddString((char*)_bstr_t(TheValue));
   //将该值加入到列表控件中
 
   //取纪录字段值方式之二
   // _bstr_t TheValue1=m_pRecordset->Fields->GetItem("BIG_NAME")->Value;
   // CString temp=TheValue1.copy();
   // m_List.AddString(temp);
   //数据类型转换
   _variant_t vUsername,vBirthday,vID,vOld;
   TRACE("id:%d,姓名:%s,年龄:%d,生日:%s/r/n",
   vID.lVal,(LPCTSTR)(_bstr_t)vUsername,vOld.lVal,(LPCTSTR)(_bstr_t)vBirthday);

   m_pRecordset->MoveNext();//转到下一条纪录
  }
  m_pRecordset->Close();
  m_pConnection->Close();
 }
 catch (_com_error e)//异常处理
 {
  AfxMessageBox(e.ErrorMessage());
 }
 m_pRecordset->Close(); //注意!!!不要多次关闭!!!!否则会出错
 m_pConnection->Close();
 m_pRecordset = NULL;
 m_pConnection = NULL;
}

  程序中通过_variant_t和_bstr_t转换COM对象和C++类型的数据, _variant_t类封装了OLE自治VARIANT数据类型。在C++中使用_variant_t类要比直接使用VARIANT数据类型容易得多。

  好,编译后该程序就能运行了,但记住运行前要创建一个叫ADOTest的ODBC数据源。该程序将把表middle中的BIG_NAME字段值显示在列表控件中。

Visual C++ ADO数据库编程入门 Visual C++ ADO数据库编程入门,在VC++中使用ADO编程,事务处理操作等 立即下载

相关推荐

Visual C++ ADO 数据库编程入门

Visual C++ ADO 数据库编程入门,VC数据库编程典书籍,值得信赖!

在Visual C++中用ADO进行数据库编程

 1. 生成应用程序框架并初始化OLE/COM库环境   创建一个标准的MFC AppWizard(exe)应用程序,然后在使用ADO数据库的InitInstance函数中初始化OLE/COM库(因为ADO库是一个COM DLL库)。本例为:  BOOL CAdotestDlg::OnInitDialog() { ::CoInitialize(NULL); //初始化OLE/CO

studyall123的专栏 2623

Carsim2019与Simulink (Matlab2018b)联合仿真成功(超详细)

Carsim与Simulink联合仿真成功

强强的博客 3万+

在Visual C++中用ADO进行数据库编程(中)

在Visual C++中用ADO进行数据库编程(中)          4.执行SQL命令并取得结果记录集      为了取得结果记录集,我们定义一个指向Recordset对象的指针:_RecordsetPtr m_pRecordset;并为其创建Recordset对象的实例: m_pRecordset.CreateInstance("ADODB.Recordset");SQL命令的执行可以采

小发猫 1764

ArduSub程序学习(1)——ardupilot框架整理

AP_HAL层(硬件抽象层)是我们制作 ArduPilot 的方式可移植到许多不同的平台。有一个顶级AP_HAL libraries/AP_HAL,用于定义代码其余部分的接口 有针对具体的板子特性,然后就有了AP_HAL_XXX 子目录,例如,AP_HAL_AVR 用于基于 AVR 的 开发板,AP_HAL_PX4用于 Pixhawk 开发板和 AP_HAL_Linux 基于 Linux 开发板。工具目录tools directories工具目录是杂项支持目录。

weixin_49839886的博客 2816

AAAI2024最佳解读|FontDiffuser One-Shot Font Generation via Denoising Diffusion with Multi-Scal

本文提出了一种名为FontDiffuser的基于扩散的单次字体生成方法,旨在通过去噪扩散模型生成模仿参考图像风格的字体,同时保留源图像的内容。尽管现有的字体生成方法在性能上取得了一定的进展,但在处理复杂字符和大风格变化时仍面临挑战。FontDiffuser通过引入多尺度内容聚合(MCA)模块,有效结合不同尺度的全局和局部内容线索,从而增强复杂字符的笔画保留能力。此外,文章还提出了一种风格对比细化(SCR)模块,用于风格表示学习,利用风格提取器从图像中分离风格,并通过精心设计的风格对比损失来监督扩散模型。

haimianxiaobao11的博客 1193

在Visual C++中用ADO进行数据库编程(下)

在Visual C++中用ADO进行数据库编程(下)          5. 记录集的遍历、更新      根据我们刚才通过执行SQL命令建立好的users表,它包含四个字段:ID,username,old,birthday以下的代码实现:打开记录集,遍历所有记录,删除第一条记录,添加三条记录,移动光标到第二条记录,更改其年龄,保存到数据库。 _variant_t vUsername,vBir

小发猫 1758

告别玄学调参:手把手教你用LSTM-AutoEncoder为传感器数据做异常检测(实战篇)

本文详细介绍了LSTM-AutoEncoder在传感器数据异常检测中的工程化实践,包括数据预处理、模型架构设计和生产环境部署策略。通过结合LSTM的时间序列处理能力和AutoEncoder的特征提取优势,该方法能够有效识别温湿度、PM2.5等传感器数据的异常模式,适用于工业物联网和室内空气质量监测等场景。

weixin_29212429的博客 477

Visual C++中用ADO进行数据库编程

1. 生成应用程序框架并初始化OLE/COM库环境 创建一个标准的MFC AppWizard(exe)应用程序,然后在使用ADO数据库的InitInstance函数中初始化OLE/COM库(因为ADO库是一个COM DLL库)。本例为:  BOOL CAdotestDlg::OnInitDialog(){     ::CoInitialize(NULL); //初始化OLE

知而获智 1644

基于FPGA与红外成像的眼动追踪系统设计与实现(教学向)

本文详细介绍了基于FPGA与红外成像的眼动追踪系统设计与实现。通过红外摄像头采集图像,利用FPGA进行实时图像处理和红外瞳孔追踪,结合Verilog编程实现多目标检测与瞳孔定位。该系统适用于嵌入式视觉教学,展示了硬件搭建、算法优化及实时显示的完整流程。

g5h6i7j的博客 823

初探802.11协议(0)——PCF/DCF与CSMA/CA机制

IEEE802.11 CSMA/CA机制与DCF机制

FanFF的博客 4505
上一篇: 在ODBC中应用DDX和RFX
下一篇: 在VC中使用ADO开发数据库应用程序
普通网友
博客等级 码龄22年 1万+粉丝 3156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值