Microsoft Jet 4.0 VC++中通过ADO中的_RecordsetPtr操作数据库:增删改查

这篇具有很好参考价值的文章主要介绍了Microsoft Jet 4.0 VC++中通过ADO中的_RecordsetPtr操作数据库:增删改查。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

VC++中通过ADO中的_RecordsetPtr操作数据库:增删改查

_RecordsetPtr智能指针,它是专门为通过记录集操作数据库而设立的指针,通过该接口可以对数据库的表内的记录、字段等进行各种操作。

要搞清楚:数据库和ADO的记录集是两个不同的概念,是存在于不同物理位置的两个存储空间。记录集相当于是实际数据的一份拷贝。正因为记录集是相对脱离数据库而存在的,所以才存在后面将要介绍的Open方法中涉及的光标类型和锁定类型这两个问题。

_RecordsetPtr接口的使用方法:

先创建记录集对象:

_ConnectionPtr m_pRecordset;
m_pRecordset.CreateInstance(__uuidof(Recorset));

创建记录集对象后,只是为它分配内存空间,记录集中不含任何数据。记录集对象是用来获得数据库中的数据并对其操作的,所以还要打开记录集,从数据库中取得数据记录。可有多种方法打开记录集,下面只介绍最常用的Open方法:

为记录集对象分配了空间后就可以用Open函数打开记录集,该函数原型为:

HRESULT Recordset15::Open(const_variant_t& Source,
                          const_variant_t& ActiveConnection,
                          enum CursorTypeEnum CursorType,
                          enum LockTypeEnum LockType,
                          long Options);

Source 是数据查询字符串。

ActiveConnection 是已经建立好的连接(我们需要用 Connection 对象指针来构造一个 _variant_t 对象)。

CursorType 光标类型,它是枚举 CursorTypeEnum 中的一个值。

LockType 锁定类型 它是枚举 LockTypeEnum 中的一个值

Options 指定 Source 的类型,光标类型 CursorType,可取如下值之一:

adOpenUnspecified = -1 不作特别指定
adOpenForwardOnly =0   默认值,前滚静态光标。这种光标只能向前浏览记录集,比如用 MoveNext 向前滚动,这种方式可节省资源,提高浏览速度,但诸如BookMark、RecordCount、AbsolutePosition、AbsolutePage都不能使用。
adOpenKeyset = 1       键集游标,采用这种光标的记录集看不到其它用户的新增、删除操作,但对于更新原有记录的操作对你是可见的。
adOpenDynamic = 2      动态光标,所有数据库的操作都会立即在用户记录集上反应出来。
adOpenStatic = 3       静态游标。它为记录产生一个静态备份,其他用户的新增、删除、更新操作对你的记录集来说是不可见的。

LockType 锁定类型,它可以是以下值之一,请看如下枚举结构

enum LockTypeEnum
{
   //未指定
   adLockUnspecified = -1,
   
   //只读记录集,默认值。无法更改数据。
   adLockReadOnly = 1,
   
   //悲观锁定方式。只有在调用Update方法时才锁定记录。这是最安全的锁定机制
   adLockPessimistic = 2,
   
   //乐观锁定方式,只有在你调用Update方法时才锁定记录。
   adLockOptimistc = 3,
   

   在此之前仍然可以做数据的更新、插入、删除等操作
   adLockBatchOptimistic = 4 乐观分批更新。编辑时记录不会锁定,更改、插入及删除是在批处理模式下完成。

}

关于光标和锁定类型,对于一般用户,建议您只作简单了解,后面将进一步进行解说。

Options可以取如下值之一:

adCmdText: 表明CommandText是文本命令。
adCmdTable:表明CommandText是一个表名。
adCmdProc:表明CommandText是一个存储过程。
adCmdUnknown:未知。

例如:假设m_pConnection是我们已经建立好的连接,我们使用_RecordsetPtr接口的Open方法打开Employees表的记录集的语句如下:

m_pRecordset->Open("SELECT * FROM Employees",
          _variant_t((IDispatch*)m_pConnection,true),
          adOpenStatic,
          adLockOptimistic,
          adCmdText);

例程RecordsetPtr演示使用_RecordsetPtr指针通过记录集操作数据库。

打开VC++6.0,新建一个基于对话框的工程RecordsetPtr。在对话框IDD_RECORDSETPTR_DIALOG中进行编辑:

使用三个GroupBox分成四个部分,第一部分演示如何读取数据库数据;第二部分演示如何修改数据库;第三部分演示如何向数据库中插入数据;第四部分演示如何删除数据库中的数据。

使用ClassWizard给列表框IDC_LIST1创建CListBox变量m_list1:

该段代码演示了如何读取数据库表内的数据

其原理是如果没有遇到表结束标志adoEOF,则用GetCollect(字段名)来获取当前记录指针所指的字段值,然后再用MoveNext()方法移动到下一条记录位置。

双击IDC_BTN_READREC按钮,并编辑OnBtnReadrec()函数如下:

void CRecordsetPtrDlg::OnBtnReadrec()
{
   _ConnectionPtr m_pConnection;
   _RecordsetPtr m_pRecordset;

   try
   {
      m_pConnection.CreateInstance(__uuidof(Connection));
      m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=Northwind.mdb","","",adModeUnknown);
   }
   catch(_com_error e)
   {
      CString errormessage;
      errormessage.Format("连接数据库失败!\r错误信息:%s",e.ErrorMessage());
      AfxMessageBox(errormessage);
      return;
   }

   try
   {
      m_pRecordset.CreateInstance("ADODB.Recordset");
      m_pRecordset->Open("SELECTEmployeeID,FirstName,LastName,HireDate,City FROM Employees WHERECity='London'",
          _variant_t((IDispatch*)m_pConnection,true),
          adOpenStatic,
          adLockOptimistic,
          adCmdText);
   }
   catch(_com_error &e)
   {
      AfxMessageBox(e.Description());
   }

   _variant_t vEmployeeID,vFirstName,vLastName,vHireDate,vCity;

   try
   {
      while(!m_pRecordset->adoEOF)
      {
          vEmployeeID=m_pRecordset->GetCollect(_variant_t((long)0));
          //取得第1列的值,从0开始计数,你也可以直接列出列的名称,如下一行
          vFirstName=m_pRecordset->GetCollect("FirstName");
          vLastName=m_pRecordset->GetCollect("LastName");
          vHireDate=m_pRecordset->GetCollect("HireDate");
          vCity=m_pRecordset->GetCollect("City");
          
          CString strtemp;
          if(vEmployeeID.vt!=VT_NULL)
          {
             strtemp.Format("%d",vEmployeeID.lVal);
          }

          if(vFirstName.vt!=VT_NULL)
          {
             strtemp+="";
             strtemp+=(LPCTSTR)(_bstr_t)vFirstName;
          }

          if(vLastName.vt!=VT_NULL)
          {
             strtemp+="";
             strtemp+=(LPCTSTR)(_bstr_t)vLastName;
          }

          if(vHireDate.vt!=VT_NULL)
          {
             strtemp+="";
             strtemp+=(LPCTSTR)(_bstr_t)vHireDate;
          }

          if(vCity.vt!=VT_NULL)
          {
             strtemp+="";
             strtemp+=(LPCTSTR)(_bstr_t)vCity;
          }

          m_list1.AddString(strtemp);
          m_list1.AddString("\n");
          m_pRecordset->MoveNext();
      }
   }
   catch(_com_error &e)
   {
      AfxMessageBox(e.Description());
   }

   m_pRecordset->Close();
   m_pRecordset=NULL;
   m_pConnection->Close(); 
   m_pConnection=NULL; 
}

该段代码演示了如何修改记录中的字段值:

将记录指针移动到要修改记录的位置处,直接用PutCollect(字段名,值)将新值写入并Update()更新到数据库即可。

移动记录指针

MoveFirst()方法移动到第一条记录
MoveLast()方法移动到最后一条记录
MovePrevious()方法移动到当前记录的前一条记录
MoveNext()方法移动到当前记录的下一条记录

也可以使用Move(记录号)移动记录指针到需要位置。注意:Move()方法是相对于当前记录来移动指针位置的。正值向后移动,负值向前移动。如Move(3),当前记录是3时,它将从记录3开始往后再移动3条记录位置。关于移动记录指针后面将会用到。

双击IDC_BTN_CHANGE按钮,并编辑OnBtnChange()函数如下:

void CRecordsetPtrDlg::OnBtnChange()
{
   _ConnectionPtr m_pConnection;
   _RecordsetPtr m_pRecordset;

   try
   {
      m_pConnection.CreateInstance(__uuidof(Connection));
      m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=Northwind.mdb","","",adModeUnknown);
   }
   catch(_com_error e)
   {
      CString errormessage;
      errormessage.Format("连接数据库失败!\r错误信息:%s",e.ErrorMessage());
      AfxMessageBox(errormessage);
      return;
   }

   try
   {
      m_pRecordset.CreateInstance("ADODB.Recordset");
      m_pRecordset->Open("SELECTEmployeeID,FirstName,LastName,HireDate,City FROM Employees WHERE(City='London') AND (EmployeeID=6)",
          _variant_t((IDispatch*)m_pConnection,true),
          adOpenStatic,
          adLockOptimistic,
          adCmdText);
   }
   catch(_com_error &e)
   {
      AfxMessageBox(e.Description());
   }

   try
   {
      while(!m_pRecordset->adoEOF)
      {
          m_pRecordset->PutCollect("LastName",_variant_t("Jackson"));
          m_pRecordset->MoveNext();
      }

      m_pRecordset->Update();
   }
   catch(_com_error* e)
   {
      AfxMessageBox(e->ErrorMessage());
   }

   m_pRecordset->Close();
   m_pRecordset=NULL;
   m_pConnection->Close(); 
   m_pConnection=NULL;
}

该段代码演示如何插入记录:

先用AddNew()方法新增一个空记录,再用PutCollect(字段名,值)输入每个字段的值,最后用Update()更新到数据库即可。

双击IDC_BTN_NEW按钮,并编辑OnBtnNew()函数如下:

void CRecordsetPtrDlg::OnBtnNew()
{
   _ConnectionPtr m_pConnection;
   _RecordsetPtr m_pRecordset;

   try
   {
      m_pConnection.CreateInstance(__uuidof(Connection));
      m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=Northwind.mdb","","",adModeUnknown);
   }
   catch(_com_error e)
   {
      CString errormessage;
      errormessage.Format("连接数据库失败!\r错误信息:%s",e.ErrorMessage());
      AfxMessageBox(errormessage);
      return;
   }

   try
   {
      m_pRecordset.CreateInstance("ADODB.Recordset");
      m_pRecordset->Open("SELECT * FROMEmployees",
      _variant_t((IDispatch*)m_pConnection,true),
      adOpenStatic,
      adLockOptimistic,
      adCmdText);
   }
   catch(_com_error &e)
   {
      AfxMessageBox(e.Description());
   }

   try
   {
      m_pRecordset->MoveLast();
      m_pRecordset->AddNew();
      m_pRecordset->PutCollect("EmployeeID",_variant_t((long)10));
      m_pRecordset->PutCollect("FirstName",_variant_t("Mary"));
      m_pRecordset->PutCollect("LastName",_variant_t("Williams"));
      m_pRecordset->PutCollect("HireDate",_variant_t("15/4/199312:00:00"));
      m_pRecordset->PutCollect("City",_variant_t("NewYork"));
      m_pRecordset->PutCollect("Country",_variant_t("USA"));
   }
   catch(_com_error *e)
   {
      AfxMessageBox(e->ErrorMessage());
   }

   m_pRecordset->Update();
   m_pRecordset->Close();
   m_pRecordset=NULL;
   m_pConnection->Close(); 
   m_pConnection=NULL;
}

该段代码演示了如何删除记录:

先将记录指针移动到要删除的记录的位置,直接用Delete()方法删除它,并用Update()来更新数据库即可。

使用记录集操作完毕后要关闭记录集:

双击IDC_BTN_DELETE按钮,并编辑OnBtnDelete()函数如下:文章来源地址https://www.toymoban.com/news/detail-617403.html

void CRecordsetPtrDlg::OnBtnDelete()
{
   _ConnectionPtr m_pConnection;
   _RecordsetPtr m_pRecordset;

   try
   {
      m_pConnection.CreateInstance(__uuidof(Connection));
      m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=Northwind.mdb","","",adModeUnknown);

   }
   catch(_com_error e)
   {
      CString errormessage;
      errormessage.Format("连接数据库失败!\r错误信息:%s",e.ErrorMessage());
      AfxMessageBox(errormessage);
      return;
   }

   try
   {
      m_pRecordset.CreateInstance("ADODB.Recordset");
      m_pRecordset->Open("SELECT * FROMEmployees",
      _variant_t((IDispatch*)m_pConnection,true),
      adOpenStatic,
      adLockOptimistic,
      adCmdText);
   }
   catch(_com_error &e)
   {
      AfxMessageBox(e.Description());
   }

   try
   {
      //假设删除第10条记录
      m_pRecordset->MoveFirst();
      m_pRecordset->Move(9);
      m_pRecordset->Delete(adAffectCurrent);

      //参数adAffectCurrent为删除当前记录
      m_pRecordset->Update();
   }
   catch(_com_error *e)
   {
      AfxMessageBox(e->ErrorMessage());
   }

   m_pRecordset->Close();
   m_pRecordset=NULL;
   m_pConnection->Close(); 
   m_pConnection=NULL;
}

到了这里,关于Microsoft Jet 4.0 VC++中通过ADO中的_RecordsetPtr操作数据库:增删改查的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Win10 64 未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”

    项目(不是解决方案)》属性》web》服务器》位数》设置成:x86   如果没有x86  生成-配置管理器-平台-点击Any Cpu选项卡-新建-新建平台-X86。 未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序,如果是64位平台。解决方法:VS工具项目-属性-生成-配置管理器-平台-点击Any Cp

    2024年02月12日
    浏览(35)
  • 未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”/Microsoft.ACE.OLEDB.12.0”提供程序

    目录 问题描述:未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序 原因分析: Provider和平台版本(32位or64位) 解决办法:

    2024年02月05日
    浏览(24)
  • 【未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序的解决方案】

    #未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序? 由于最近win10系统崩溃,重装了系统,原来能正常运行的网站,出现了错误的提示–未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序,网上搜索的方法都用了一遍,但都没解决,本来准备重装系统,但试了试调用

    2024年02月11日
    浏览(36)
  • Excel导入数据,未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序

    .NET在导入Excel时,使用了一个Microsoft.Jet.OLEDB.4.0 是数据接口技术,然后客户端未安装对应的插件,导致无法正常导入数据到数据库 显示报错:未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序 在对应的 IIS 应用程序池中,设置应用程序池默认属性 /常规 /启用32位应用程序

    2024年02月13日
    浏览(31)
  • Java中通过List中的stream流去匹配相同的字段去赋值,避免for循环去查询数据库进行赋值操作

    Q :上面两个列表怎么使用流,根据equipmentDeviceMessageInfo中的phone字段去匹配userList 中的phone字段再获取userList 中是name赋值给equipmentDeviceMessageInfo 中的name。 A :以前的写法是通过for循环遍历一个一个去查询赋值,这样的话如果数据多的话一个一个遍历会查询的话肯定是很慢的,

    2024年02月07日
    浏览(36)
  • Microsoft Visual C++下载,VC++下载

    Microsoft Visual C++ 2019 v14.28.29617 Microsoft Visual C++ Redistributable(系统运行库,简称MSVC,VB/VC)是Windows操作系统应用程序的基础类型库组件。 Microsoft Visual C++运行库,Windows系统装机必备组件,这是官方版安装包。 Microsoft Visual C++ 2019为创建基于微软 Windows 和基于 Microsoft .NET 的应用

    2024年02月12日
    浏览(46)
  • Microsoft微软官方Win10 visual c++(vc++2019)运行库下载

    最新支持Visual C++ 可再发行程序包下载 | Microsoft Docs 本文列出了最新版本的包的下载Visual C++ 可再发行程序包链接。 https://support.microsoft.com/zh-cn/help/2977003/the-latest-supported-visual-c-downloads 安装后可以解决某些软件(如QQ)运行时 .dll 文件报错问题

    2024年02月16日
    浏览(41)
  • 使用VS2019连接Microsoft SQL Server Compact 4.0数据库

    SQL Server Compact Edition是微软推出的一个适用于嵌入到移动应用的精简数据库产品,Windows Mobile开发人员能够使用SQL Server CE开发出将数据管理能力延展到Window Mobile移动设备上的应用程序。虽然SQL Server CE占用的磁盘空间只有3到5兆左右,但是它功能并没有像它的容量那样大幅度缩

    2024年02月09日
    浏览(36)
  • 关于 Cannot resolve com.microsoft.sqlserver:sqljdbc4:4.0的问题

    【问题】 在pom文件中添加依赖: 项目进行编译时:出现“Cannot resolve com.microsoft.sqlserver:sqljdbc4:4.0”的问题。 【原因】 微软不允许以Maven的方式下载改文件。 【解决方案】 手动下载Jar包 打开CMD窗口,进入Jar包所在的目录,并执行命令: 解释:mvn install:install-file -Dfile=“jar包的

    2024年02月13日
    浏览(23)
  • VMWare安装报错:此安装程序要求您重新启动系统以完成 Microsoft VC Redistributable安装,然后重新运行该安装程序。

    方法总比困难多! 本人很长时间没有碰Linux了,今天就想着先装个虚拟机玩玩,但是安装VMWare的过程也遇到了一些问题,,所以将问题的解决方法总结了一下,仅供大家参考~ 问题一:此安装程序要求您重新启动系统以完成 Microsoft VC Redistributable安装,然后重新运行该安装程序

    2024年02月05日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包