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

这篇具有很好参考价值的文章主要介绍了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 CursorTypeEnumCursorType,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,///只读记录集

         adLockPessimistic = 2, 悲观锁定方式。数据在更新时锁定其它所有动作,这是最安全的锁定机制

         adLockOptimistic = 3, 乐观锁定方式。只有在你调用Update方法时才锁定记录。在此之前仍然可以做数据的更新、插入、删除等动作

         adLockBatchOptimistic = 4,乐观分批更新。编辑时记录不会锁定,更改、插入及删除是在批处理模式下完成。

};

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

Options可以取如下值之一:

adCmdText: 表明CommandText是文本命令。

adCmdTable:表明CommandText是一个表名。

adCmdProc:表明CommandText是一个存储过程。

adCmdUnknown:未知。

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

m_pRecordset->Open(“SELECT * FROMEmployees”,

          _variant_t((IDispatch*)m_pConnection,true),

          adOpenStatic,

          adLockOptimistic,

          adCmdText);

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

  1. 打开VC++6.0,新建一个基于对话框的工程RecordsetPtr。在对话框IDD_RECORDSETPTR_DIALOG中进行编辑:
  2. 使用三个GroupBox分成四个部分,第一部分演示如何读取数据库数据;第二部分演示如何修改数据库;第三部分演示如何向数据库中插入数据;第四部分演示如何删除数据库中的数据。
  3. 使用ClassWizard给列表框IDC_LIST1创建CListBox变量m_list1:
  4. 双击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("SELECT EmployeeID,FirstName,LastName,HireDate,City FROM Employees WHERE City='London'",

                            _variant_t((IDispatch*)m_pConnection, true),

                            adOpenStatic,

                            adLockOptimistic,

                            adCmdText);

         }

         catch (_com_error &e)

         {

                   AfxMessageBox(e.Description());

         }

         _variant_tvEmployeeID, 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;

}

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

双击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("SELECT EmployeeID,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;

}

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

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

移动记录指针可以通过MoveFirst()方法移动到第一条记录,MoveLast()方法移动到最后一条记录,MovePrevious()方法移动到当前记录的前一条记录,MoveNext()方法移动到当前记录的下一条记录。也可以使用Move(记录号)移动记录指针到需要位置。

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

双击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 * FROM Employees",

                            _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;

}

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

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

双击IDC_BTN_DELETE按钮,并编辑OnBtnDelete()函数如下:

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 * FROM Employees",

                            _variant_t((IDispatch*)m_pConnection, true),

                            adOpenStatic,

                            adLockOptimistic,

                            adCmdText);

         }

         catch (_com_error &e)

         {

                   AfxMessageBox(e.Description());

         }

         try

         {

                   m_pRecordset->MoveFirst();

                   m_pRecordset->Move(9); //假设删除第10条记录

                   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;

}

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

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

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

直接用Close()方法关闭记录集并赋予其空值。代码如下:

m_pRecordset->Close();

m_pConnection->Close();

m_pRecordset=NULL;

m_pConnection=NULL;文章来源地址https://www.toymoban.com/news/detail-796920.html

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

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

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

相关文章

  • 五、C#与数据库交互( ADO.NET基础)

    在C#中与数据库进行交互,通常使用ADO.NET(ActiveX Data Objects .NET)框架。ADO.NET是.NET Framework中用于数据访问的一组类库,它提供了多种用于连接和操作数据库的方法。 以下是使用ADO.NET与数据库交互的一些基本步骤: 1. 引入命名空间 在C#程序中,你需要引入 System.Data.SqlClient 命

    2024年02月02日
    浏览(41)
  • Ado.Net 数据库访问技术(.Net 6版本)

    ADO.NET的名称起源于ADO(ActiveX Data Objects),是一个COM组件库,用于在以往的Microsoft技术中访问数据。之所以使用ADO.NET名称,是因为Microsoft希望表明,这是在NET编程环境中优先使用的数据访问接口。 ADO.NET可让开发人员以一致的方式存取资料来源(例如 SQL Server 与 XML),以及透

    2024年02月07日
    浏览(30)
  • GBASE南大通用数据库通过 GBase ADO.NET 接口读取数据

    通过 GBase ADO.NET 接口读取 GBase Server 数据需要下面的步骤:  1) 使用 GBaseConnection 创建数据库连接对象   2) 使用 GBaseCommand 创建命令对象   3) 使用连接对象打开连接  4) 设置命令对象的 CommandText 属性,指明查询语句,并关联连接对象  5) 执行命令对象的 ExecuteReader 方法后返

    2024年01月24日
    浏览(36)
  • .net----数据库的访问ADO.NET、DataAdapter和DataSet

    ADO.NET的概述 使用ADO.NET连接和操作数据库 使用DataAdapter和DataSet访问数据库 .NET Framework提供的数据访问服务的类库 提供对关系数据、XML和应用程序数据各种数据源的一致访问 应用程序使用ADO.NET连接到数据源,检索、处理和更新数据 SQL Server数据源:System.Data.SqlClient命名空间

    2024年02月07日
    浏览(25)
  • 问题记录:MFC使用ADO在32位和64位下分别连接ACCESS数据库碰到的问题

    题外话:近期收到个任务,给合作的公司弄一个静态库,库的功能需要加载文件夹中的ACCESS数据库,合作方希望同时有32位的 和 64位的。 进入正题把,首先声明,我的ACCESS数据库文件后缀是.mdb的 在x86下导入msado15.dll,我是这样写的 我按网上说的#import \\\"C:Program FilesCommon Fil

    2024年02月03日
    浏览(35)
  • 一文详解python中的数据库操作

    最近做毕设,需要添加个数据库,记录一下。 重点介绍数据库API接口中的连接对象和游标对象 1. 连接对象 数据库连接对象主要提供获取数据库游标对象和提交/回滚事务的方法,以及关闭数据库连接。 使用connect函数获取对象,该函数有多个参数: host 主机名 database/db 数据库

    2024年02月07日
    浏览(29)
  • python中的pymssql操作MSSQL数据库

    在Python中,pymssql是一个用于与Microsoft SQL Server数据库进行交互的第三方库。pymssql提供了连接到数据库、执行SQL查询、插入、更新和删除数据等功能。下面我将详细介绍如何使用pymssql进行MSSQL数据库操作。 安装pymssql库 首先,确保你的Python环境已经安装了pymssql库。你可以使用

    2024年02月09日
    浏览(46)
  • 基于Linux操作系统中的MySQL数据库操作(三十)

    MySQL数据库安装 目录 一、概述 (一)什么是数据库 (二)数据库能干什么     1、企业应用     2、金融行业     3、电子商务     4、社交媒体     5、物联网 (三)为什么要用数据库,优势、特性?     1、可靠性和稳定性     2、数据管理能力     3、数据共享和集成  

    2024年02月15日
    浏览(44)
  • Mysql 数据库DML 数据操作语言—— 对数据库表中的数据进行更改UPDATE 和删除DELETE

        delete语句可以有条件,也可以没有,如果没有条件的话就是删除整张表 delete不可以删除表中某一个字段的值,但是update可以; 

    2024年01月19日
    浏览(42)
  • 在.net中通过自定义LoggerProvider将日志保存到数据库方法(以mysql为例)

      在.NET中, Microsoft.Extensions.Logging是一个灵活的日志库,它允许你将日志信息记录到各种不同的目标,包括数据库。在这个示例中,我将详细介绍如何使用Microsoft.Extensions.Logging将日志保存到MySQL数据库。我们将使用Entity Framework Core来与MySQL数据库进行交互。 首先,我们需要创

    2024年02月05日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包