孙鑫VC学习笔记:第二十讲 ado数据库编程

2024-03-25 15:48

本文主要是介绍孙鑫VC学习笔记:第二十讲 ado数据库编程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

数据库编程:

COM

[] 小型可执行程序的扩展名, 串行通讯端口

[] Commercial organizations,商业组织,公司

The Component Object Model组件对象模型

ADO的三个核心对象

Connection对象

Connection对象表示了到数据库的连接,它管理应用程序和数据库之间的通信。RecordestCommand对象都有一个ActiveConnection属性,该属性用来饮用Connection对象。

Command对象

Command对象被用来处理重复执行的查询,或处理需要检查在存储过程调用中的输出或返回参数的值的查询。

Recordset对象

Recordset对象被用来获取数据。Recordset对象存放查询的结果,这些结果又数据的行(称为记录)和列(成为字段)组成。每一列都存放在RecordsetFields集合中的一个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技术编写的,ADOOLE 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()的方法进行类型转换

 

6com的专用数据类型

 

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数据库编程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/845481

相关文章

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

MySQL追踪数据库表更新操作来源的全面指南

《MySQL追踪数据库表更新操作来源的全面指南》本文将以一个具体问题为例,如何监测哪个IP来源对数据库表statistics_test进行了UPDATE操作,文内探讨了多种方法,并提供了详细的代码... 目录引言1. 为什么需要监控数据库更新操作2. 方法1:启用数据库审计日志(1)mysql/mariad

postgresql数据库基本操作及命令详解

《postgresql数据库基本操作及命令详解》本文介绍了PostgreSQL数据库的基础操作,包括连接、创建、查看数据库,表的增删改查、索引管理、备份恢复及退出命令,适用于数据库管理和开发实践,感兴... 目录1. 连接 PostgreSQL 数据库2. 创建数据库3. 查看当前数据库4. 查看所有数据库

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

Oracle 数据库数据操作如何精通 INSERT, UPDATE, DELETE

《Oracle数据库数据操作如何精通INSERT,UPDATE,DELETE》在Oracle数据库中,对表内数据进行增加、修改和删除操作是通过数据操作语言来完成的,下面给大家介绍Oracle数... 目录思维导图一、插入数据 (INSERT)1.1 插入单行数据,指定所有列的值语法:1.2 插入单行数据,指

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手