数据库编程:
COM
[计] 小型可执行程序的扩展名, 串行通讯端口
[域] Commercial organizations,商业组织,公司
The Component Object Model组件对象模型
ADO的三个核心对象
Connection对象
Connection对象表示了到数据库的连接,它管理应用程序和数据库之间的通信。Recordest和Command对象都有一个ActiveConnection属性,该属性用来饮用Connection对象。
Command对象
Command对象被用来处理重复执行的查询,或处理需要检查在存储过程调用中的输出或返回参数的值的查询。
Recordset对象
Recordset对象被用来获取数据。Recordset对象存放查询的结果,这些结果又数据的行(称为记录)和列(成为字段)组成。每一列都存放在Recordset的Fields集合中的一个Filed对象中
关于ADO数据库连接方面知识的总结
1、导入库文件
使用ADO前必须在工程的stdafx.h文件最后用直接引入符号#import引入ADO库文件,以使编译器能正确编译。代码如下:
#import "C:/Program Files/common files/system/ado/msado15.dll" no_namespace rename("EOF","EndOfFile") rename("BOF","FirstOfFile")
ADO类的定义是作为一种资源存储在ADO DLL(msado15.dll)中,在其内部称为类型库。
类型库描述了自治接口,以及C++使用的COM vtable接口。
当使用#import指令时,在运行时Visual C++需要从ADO DLL中读取这个类型库,
并以此创建一组C++头文件。这些头文件具有.tli 和.tlh扩展名,#import引入ADO库文件的代码编译后,在项目的目录下生成了这两个文件。在C++程序代码中调用的ADO类要在这些文件中定义。
程序的第三行指示ADO对象不使用名称空间,在有些应用程序中,
由于应用程序中的对象与ADO中的对象之间可能会出现命名冲突,所以有必要使用名称空间。
如果要使用名称空间,则可把第三行程序修改为: rename_namespace("AdoNS")。
第四行代码将ADO中的EOF(文件结束)更名为adoEOF,因为文件的结尾也是以EOF结尾的,是为了避免与定义了自己的EOF的其他库冲突。 至于改为什么名字,可以根据自己的命名习惯自己确定。
2、初始化COM环境
OLE DB 是基于COM技术编写的,ADO是OLE DB基础之上的用户程序,
OLE DB是一个COM组件,在访问COM组件的时候需要初始化COM库,方法如下:
(1)   ::CoInitialize(NULL); //初始化OLE/COM库环境
//对数据库的访问在上下代码之间写,下面第三步就应该写在这里
::CoUninitialize();//既然初始化了环境,当然一定要记得释放他了
(2)也可以调用MFC全局函数
AfxOleInit();
3、三大指针对象的定义和创建实例
(1)
_ConnectionPtr pConnection("ADODB.Connection");
_RecordsetPtr pRecordset("ADODB.Recordset");
_CommandPtr pCommand("ADODN.Command");
(2)
_ConnectionPtr pConnection;
_RecordsetPtr pRecordset;
_CommandPtr pCommand;
pConnection.CreateInstance(__uuidof(Connection));
pRecordset.CreateInstance(__uuidof(Recordset));
pCommand.CreateInstance(__uuidof(Command));
要产生一个智能指针对象,其实在定义的同时也可以初始化,如:
_ConnectionPtr pConnection(__uuidof(Connection));
_ConnectionPtr 是智能指针
__uuidof() 用来获取Connection全局唯一标识符
(3)
_ConnectionPtr pConnection;
_RecordsetPtr pRecordset;
_CommandPtr pCommand;
pConnection.CreateInstance("ADODB.Connection");
pRecordset.CreateInstance("ADODB.Recordset");
pCommand.CreateInstance("ADODB.Command");
4、打开一个连接
pConnection->ConnectionString = "这里的字符串有下面四种写法";//对连接字符串赋值
pConnection->Open(ConnectionString,"","",adModeUnknown); //连接数据库
第二三个参数分别为用户的ID与密码,
因为在连接字符串ConnectionCstring中已经设置好了,这里可以为空。
第四个参数可以取下面两个参数:
adAsyncConnect
异步打开数据库,在ASP中直接用16
adConnectUnspecified
同步打开数据库,在ASP中直接用-1
ConnectionString根据不同的数据源,分别对应不同的写法
(要记下来很困难,可以在VB中利用ADO控件先连接好,再将其拷贝在VC中,这样不容易出错)
1)
访问Access 2000
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=databaseName;User ID=userName;Password=userPassWord"
2)
访问ODBC数据
"Provider=MADASQL;DSN=dsnName;UID=userName;PWD=userPassword;"
3)
访问Oracle数据库
“Provider=MSDAORA;Data Sourse=serverName;User ID=userName;Password=userPassword;"
4)
访问MS SQL数据库
"Provider=SQLOLEDB,Data Source=serverName;Initial Catalog=databaseName;User ID=userName;Password=userPassword;"
5、执行SQL命令,得到数据
方法1:
pRecordset = pConnection->Execute("Select * from authors",NULL,adCmdText);
方法2:
pRecordset ->Open("Select * from authors",_
variant_t((Idispacth*) pConnection), //设置活动连接
adOpenDynamtic,
//游标类型
adLockOptimistic,
//锁的类型
adCmdText);
方法3:
pCommand->put_ActiveConnection(_variant_t((Idispatch *) pConn);
pCommand->CommandText = "Select * from authors";
pRecordset = pCmd->Execute(NULL,NULL,adCmdText);
得到数据之后,做一个循环取得数据:
While (!pRecordset ->adoEOF)
{
Str = pRecordset->GetCollect("au_lname"));
pRst->MoveNext();
}
SQL命令比较多,但是不去考虑细节,这里只说出通用的方法
CString strSQL;//定义SQL命令串,用来保存SQL语句
strSQL.Format("SQL statement");
然后在每个要用到SQL命令串的方法中,使用strSQL.AllocSysString()的方法进行类型转换
6、com的专用数据类型
variant ,bstr ,SafeArray
variant变量的范围包括很多,它是一种变体类型,主要用于支持自动化的语言访问,
从而在VB中非常方便地使用,但是VC中比较复杂,它使用_variant_t 进行管理
bstr是一种字符串变量,使用_bstr_t进行管理,这个类重载了char *操作符
7、关闭连接
if(pConnection->State);     //不能多次关闭,否则会出现错误
pConnection->Close();
pRecordset->Close();
pCommand.Release();
pConnection.Release();
//释放引用计数
pRecordset.Release();
注意:调用Close()时用"->",调用Release()时要用".",为什么?
因为智能指针,_ConnectionPtr是一个重载了->运算符的类
_ConnectionPtr:它是一个接口指针模板。'.'是模板_com_ptr的函数。->是'接口函数'调用。
//forexample:
_ConnectionPtr m_Conn;
m_Conn.CreateInstance(....);//Createinterfaceinstance.
m_Conn->Open(...);//Openaconnectiontodatabase.
'->'是_com_ptr重载了的运算符.目的就是为了让你调用模板参数的函数.
8、结构化异常处理
ADO封装了COM接口,所以需要进行错误处理
如下例:
HRESULT hr;
try
{
hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
if(SUCCEEDED(hr))
{
hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb","","",adModeUnknown);///连接数据库
///上面一句中连接字串中的Provider是针对ACCESS2000环境的,对于ACCESS97,需要改为:Provider=Microsoft.Jet.OLEDB.3.51; }
}
catch(_com_error e)///捕捉异常
{
CString errormessage;
errormessage.Format("连接数据库失败!/r/n错误信息:%s",e.ErrorMessage());
AfxMessageBox(errormessage);///显示错误信息
}
这里介绍了三种对象通过ADO访问数据库,它们都可以执行SQL语句获取数据,但不是管那种方法获取数据,最终都将数据放置到记录集对象当中。

孙鑫VC学习笔记:第二十讲 (二) ado数据库编程相关推荐

  1. 孙鑫VC++学习笔记(转载至程序员之家--虎非龙)[11--15] .

    第11课 1.创建4个菜单,为其添加消息响应,用成员变量保存绘画类型.添加LButtonDown和Up消息. 2.当窗口重绘时,如果想再显示原先画的数据,则需要保存数据.为此创建一个新类来记录绘画类型 ...

  2. 孙鑫VC++学习笔记(转载至程序员之家--虎非龙)[11--15]

    第11课 1.创建4个菜单,为其添加消息响应,用成员变量保存绘画类型.添加LButtonDown和Up消息. 2.当窗口重绘时,如果想再显示原先画的数据,则需要保存数据.为此创建一个新类来记录绘画类型 ...

  3. 孙鑫VC学习笔记:第七讲

    七.对话框 2006年8月5日 14:25 因为笔记是用OneNote做的,上传以后为看不到图片,于是我截图放到相册上面, 相册地址为:http://photo.163.com/photos/good ...

  4. 孙鑫mfc学习笔记第十四课

    第十四课 网络的相关知识,网络程序的编写,Socket是连接应用程序与网络驱动程序的桥梁,Socket在应用程序中创建,通过bind与驱动程序建立关系.此后,应用程序送给Socket的数据,由Sock ...

  5. 线性代数学习笔记——第二十讲——矩阵秩的定义

    1. 矩阵的k阶子式 2. 若矩阵的某个低阶子式全为零,则其更高阶的子式也全为零(用反证法证明) 3. 矩阵的秩的定义(满秩矩阵.非奇异矩阵.矩阵可逆.矩阵的行列式不等于零这几个概念是等价的) 4. ...

  6. Python学习笔记第二十九天(N维数组(ndarray))

    Python学习笔记第二十九天 N维数组(ndarray) 构建阵列 索引阵列 ndarray的内部内存布局 阵列属性 内存布局 数据类型 其他属性 阵列接口 ctypes外部功能接口 Array方法 ...

  7. ev3编程变量模块_英文视频教学翻译-机器人ev3编程学习的第二十讲:举例讲解数据变量模块编...

    机器人ev3编程学习的第二十讲:举例讲解数据变量模块编- Rob Widger (为了容易理解,在原文的翻译时做了修改 by EV3-TOM) 这一节我给大家讲解使用变量模块的编程,这些我喜欢的例子也 ...

  8. 初识二维码 第二十讲 二维码解码程序的组件之一 摄像头拍照功能

    初识二维码 第二十讲    二维码解码程序的组件之一 摄像头拍照功能 解码程序的第一个环节是通过摄像头这个硬件,得到二维码的图片. 对摄像头的工作原理来说,简单的描述如下:1是从摄像头得到模拟信号, ...

  9. 孙鑫VC学习系列教程

    教程简介 1.循序渐进 从Win32SDK编程开始讲解,帮助大家理解掌握Windows编程的核心 -- 消息循环机制. 2.通俗易懂 编程语言枯燥难懂,然而通过孙鑫老师形象化的讲解,Windows和M ...

  10. Scala入门到精通——第二十九节 Scala数据库编程

    本节主要内容 Scala Mavenproject的创建 Scala JDBC方式訪问MySQL Slick简单介绍 Slick数据库编程实战 SQL与Slick相互转换 本课程在多数内容是在官方教程 ...

最新文章

  1. 深度学习模型部署简要介绍
  2. 主流浏览器js 引擎内核市场份额attialx总结vOa9
  3. 一群热爱python运维的精英们!
  4. 求生之路怎么显示服务器,求生之路怎么搭建云服务器
  5. WPF-003 popup实现下拉列表的问题
  6. 页面中鼠标触碰字体后切换颜色且随鼠标移走后改变
  7. PDF复制文字到Word中太过混乱的解决方法
  8. 安卓手机抓包方法归纳总结
  9. Qt中Opencv配置
  10. 通信原理中的erf/erfc函数
  11. MTK山寨机个性化DIY移植MRP初步探讨
  12. android 手机内存清理,安卓手机内存如何清理 安卓手机内存清理方法【介绍】
  13. 肯德尔系数怎么分析_论文实战2——德尔菲法与信度分析
  14. 如何安装python_如何安装Python?(第一节)
  15. 2021年登高架设模拟考试题及登高架设复审模拟考试
  16. mysql 锁(三)
  17. 元宇宙系列之AI虚拟人:“人”潮汹涌 探路未来
  18. 成对数据T检验实例(用SPSS16.0实现)
  19. Linux 系统查询处理器架构
  20. 教你如何用C++快速生成1000万个随机数

热门文章

  1. Java操作DB2 XML数据实践
  2. ==、Equals 、ReferenceEquals它们的异同
  3. JS生成随机数并排序
  4. java word文档 转 html文件
  5. Oracle 学习之RMAN(四)增量备份
  6. windows DNS服务器的配置
  7. GridView控件事件详解
  8. 关于管理的十个经典故事
  9. MySQL分表实现上百万上千万记录分布存储的批量查询设计模式
  10. bat文件启动虚拟环境然后继续在虚拟环境里进行操作采用CALL