ado数据库编程
ADO数据库编程
long Options //指示如何计算Commandtext;如:AdCmdText是按命令的文本定义计算。
eg:使用Command对象执行SQL命令。
//创建Command对象
hr=m_pCommand.CreateInstance("mand");
if(FAILED(hr))
return 0;
}
catch(_com_error e)
{
//显示错误信息
CString errormessage;
errormessage.Format("Connection 对象执行SQL命令--操作错误!\r\n错误信息:%s,%s,e.ErrorMessage(),(LPCTSTR)e.Description());
AfxMessageBox(errormessage);
}
2)Command对象调用Execute
_RecordsetPtr Execute(
VARIANT* RecordsAffcted, // 返回此次操作所影响的记录数。
try
{
m_pCommand->ActiveConnection=m_pConnection;
m_pCommand->CommandText="INSERT INTO users(ID,username,old,birthday)
long Options //数据库打开选项,标识数据库访问权限。默认为:adModeUnknown;
);
在使用Connection对象之前还需要先使用COM接口CocreateInstance创建该对象,其函数原型如下:
数据库系统实验报告ADO连接数据库
图4-1 新建项目CREATE TABLE course (Cno char(4) NOT NULL,Cname char(40) DEFAULT NULL,Cpno char(4) DEFAULT NULL,Ccredit smallint DEFAULT NULL,PRIMARY KEY (Cno)) ;---- 转存表中的数据'course'--INSERT INTO course (Cno, Cname, Cpno, Ccredit) V ALUES ('1', '数据库', '5', 4);INSERT INTO course (Cno, Cname, Cpno, Ccredit) V ALUES ('2', '数学', NULL, 2);INSERT INTO course (Cno, Cname, Cpno, Ccredit) V ALUES ('3', '信息系统', '1', 4);INSERT INTO course (Cno, Cname, Cpno, Ccredit) V ALUES ('4', '操作系统', '6', 3);INSERT INTO course (Cno, Cname, Cpno, Ccredit) V ALUES ('5', '数据结构', '7', 4);INSERT INTO course (Cno, Cname, Cpno, Ccredit) V ALUES ('6', '数据处理', NULL, 2);INSERT INTO course (Cno, Cname, Cpno, Ccredit) V ALUESINSERT INTO student (Sno, Sname, Ssex, Sage, Sdept) V ALUES('200215123', '王敏', '女', 18, 'MA');INSERT INTO student (Sno, Sname, Ssex, Sage, Sdept) V ALUES('200215125', '张立', '男', 19, 'IS');INSERT INTO student (Sno, Sname, Ssex, Sage, Sdept) V ALUES('200215128', '陈冬', '男', 18, 'IS');---- 限制表'course'--ALTER TABLE courseADD CONSTRAINT course_ibfk_1 FOREIGN KEY (Cpno) REFERENCES course (Cno);---- 限制表'sc'--ALTER TABLE scADD CONSTRAINT sc_ibfk_1 FOREIGN KEY (Sno) REFERENCES student (Sno); ALTER TABLE scADD CONSTRAINT sc_ibfk_2 FOREIGN KEY (Cno) REFERENCES course (Cno);3.在应用程序AdoConnection类的InitInstance()函数中添加如下语句,初始化COM库AfxOleInit();首先找到源文件AdoConnection.cpp。
ADO操作数据库的方法步骤
ADO操作数据库的方法步骤ADO(ActiveX Data Objects)是一种用于操作数据库的技术,它提供了一组对象和方法,可以有效地与数据库进行交互。
ADO是使用OLE DB (Object Linking and Embedding Database)技术来实现的,它可以连接多种不同的数据库,包括SQL Server、Oracle、Access等。
下面是使用ADO操作数据库的方法步骤。
1.引用ADO库要使用ADO操作数据库,首先需要在项目中引用ADO库。
可以在编程环境中的“引用”或者“项目属性”中添加对ADO库的引用,确保可以使用ADO库提供的对象和方法。
2.创建连接对象创建一个ADO连接对象以连接到数据库。
连接对象是ADO的核心对象之一,它提供了与数据库建立连接和断开连接的功能。
可以使用Connection对象的构造函数或者使用CreateObject函数创建一个连接对象。
3.打开连接使用连接对象的Open方法来打开连接。
在打开连接之前,需要设置连接字符串(Connection String),连接字符串包含了连接数据库的详细信息,比如数据库的类型、服务器地址、用户名、密码等。
可以使用连接字符串构造函数或者直接设置连接对象的ConnectionString属性来设置连接字符串。
4.创建命令对象5.设置命令类型和SQL语句6.执行命令使用命令对象的Execute方法来执行命令。
如果SQL语句是查询语句,可以使用命令对象的Execute方法或者ExecuteReader方法执行命令,并使用记录集对象来获取返回的数据。
如果SQL语句是更新、插入或删除语句,可以使用ExecuteNonQuery方法来执行命令,该方法返回受影响的行数。
7.处理返回的数据如果执行的是查询语句,可以使用记录集对象来获取返回的数据。
可以使用记录集对象的MoveFirst方法将指针移动到第一条记录,然后使用各种属性和方法来访问记录集中的数据,比如Fields,RecordCount,EOF等。
数据库编程的ADO
Commandtext:包含要执行SQL语句,表名,
Dim connectionstring As String
connecห้องสมุดไป่ตู้ionstring = "provider=Microsoft.Jet.oledb.4.0;" & _
Provider参数:指定用来连接的提供者名称
File name:
Remote provider
Remote server
State
Adstateclosed:对象是关闭的。
Asstateopen:对象是打开的。
Adstateconnecting:指示Record对象正在连接。
Adstateexecuting:指示recordset对象正在执行命令。
Adstatefetching:指示recordset对象正在被读取。
Dim connection1 as adodb.connection
Set connection1= new adodb.connection
Connection1.provider=”Microsoft.jet.oledb.3.51”
Connection1.open “c:\.mdb”,”admin”
BeginTrans
用来连接数据源的新事务。
commitTrans ,RollbackTrans
Open
Open connectionstring,userid,password,openoptions
Execute
用来执行查询或由数据源支持的其他命令。并且返回一个RecordSet对象
第十一章 ADO数据库编程
BSTR字符串类型 BSTR字符串类型
很多自动化和COM接口使用BSTR来定义字符串。BSTR 很多自动化和COM接口使用BSTR来定义字符串。BSTR 是 PascalPascalstyle 字符串(字符串长度被明确指出)和C-style字符串(字符串的 字符串(字符串长度被明确指出)和C style字符串(字符串的 长度要通过寻找结束符来计算)的混合产物。一个BSTR是一个 长度要通过寻找结束符来计算)的混合产物。一个BSTR是一个 Unicode字符串,它的长度是预先考虑的,并且它还有一个0 Unicode字符串,它的长度是预先考虑的,并且它还有一个0字符作为 结束标记。 在 C++ 中,一个 BSTR 实际上就是一个指向Unicode字符串中第一 实际上就是一个指向Unicode字符串中第一 个字符的指针。
ADO对象结构 ADO对象结构
ADO是一个面向对象的组件库,用ADO访问数据库,其实就是 ADO是一个面向对象的组件库,用ADO访问数据库,其实就是 利用ADO对象来操作数据如的数据,所以我们首先要撑握ADO 利用ADO对象来操作数据如的数据,所以我们首先要撑握ADO 的对象 连接对象(connection): 连接对象(connection): 连接用于与数据库建立连接,执行查询及进行事务处理。在连 接时必须要指定使用何种数据库的OLEDB供应者 接时必须要指定使用何种数据库的OLEDB供应者 命令对象(Command): 命令对象(Command): 可以执行数据库操作命令(如查询,修改,增加和删除)。用 命令对象执行一个查询字串,可以返回一个记录集合。 记录集对象(Recordset): 记录集对象(Recordset): 用于表示查询返回的结果集,它可以在结果集中增加,删除, 修改和移动刻录。当建立一个记录集时,一个游标就自动建立 了,查询所产生的记录就放在本地的游标中,游标有四种类型: 仅能向前移动的游标,静态游标,键集游标和动态游标。记录 集对象是对数据库进行查询和修改的主要对象。
第10章 ADO数据库编程
(b)执行后
(a)执行前
10.3 RecordSet对象
10.3.1 Recordset对象简介
在ADO中定义了四种不同的游标类型: (1)动态游标 (2)键集游标 (3)静态游标 (4)仅向前游标
10.3.2
Recordset对象的属性
1.AbsolutePage、PageCount与PageSize属性 2.AbsolutePosition和RecordCount属性 3.ActiveConnection属性 4.CacheSize属性
题意分析:本题要用MsFlexGrid控件显示 表的内容,而MsFlexGrid控件并不是VB的标准 控件,应该首先把它加载到VB的工程中,加载 的方法是执行【工程】→【部件】命令,在出 现的部件对话框中选中“Microsoft FlexGrid Control 6.0”后按“确定”按钮。要在 MSFlexGrid控件中显示数据表中的内容,可通 过循环把表中的各字段的内容依次赋值到 MsFlexGrid的MatrixText属性中。
10.1.2 ADO模型的对象
1.基本对象
(1)Connection对象 (2)Recordset对象 (3)Command对象 (4)Field对象 (5)Property对象 (6)Parameter属性 (7)Error对象 2.集合对象 (1)Errors集合对象 (2)Parameters对象 (3)Fields对象 (4)Properties对象 3.事件 (1)ConnectionEvents类事件 (2)RecordsetEvents类事件
10.2.3 连接到数据库的方法
1.通过DSN建立连接
【例10-1】在第7章建立了两个DSN,分别是jiaoxue和 SQLPubs,请编写一个连接到这两个DSN的程序。程序 的设计界面如图10-4所示。然后执行时,单击“建立 到SQLPubs的连接”将建立与SQLPubs DSN的连接,单 “建立到jiaoxue DSN的连接”将建立与jiaoxue DSN 的连接。 题意分析:为建立连接,可先给Connection对象 的ConnectionString属性赋值为需要建立连接的参数, 然后执行Connection对象不带参数的Open方法,也可 在调用Connection的Open方法时指定连接字符串。此 题需注意连接到SQL DSN和连接到Microsoft Access DSN的区别。
使用ADO操作数据库
使用ADO操作数据库ADO (ActiveX Data Objects) 是一种用于访问数据库的编程技术,它是微软开发的一种组件对象模型(COM)。
ADO 提供了一种统一的方法来访问各种类型的数据源,如关系数据库、Excel 表格、文本文件等。
通过使用 ADO,开发人员可以简化数据库操作,并提高代码的可重复性和可维护性。
ADO 可以在许多编程环境中使用,如 Visual Basic、ASP、C++等,并且可以与不同的数据库进行交互,如 SQL Server、Oracle、MySQL等。
ADO 使用了一种层次化的模型来表示数据库,即连接、命令、记录集和字段。
下面将详细介绍如何使用 ADO 进行数据库操作。
首先,我们需要建立与数据库的连接。
在 ADO 中,可以使用Connection 对象来实现。
连接字符串是连接到数据库所需的关键信息。
例如,在连接到 SQL Server 数据库时,连接字符串通常包含服务器名称、数据库名称、用户名和密码等信息。
以下是一个示例连接字符串的格式:```Provider=SQLOLEDB;Data Source=ServerName;InitialCatalog=DatabaseName;User ID=UserName;Password=Password;```接下来,使用 Connection 对象打开与数据库的连接:```vbDim conn As New ADODB.Connectionconn.Open "连接字符串"``````vbcmd.ActiveConnection = conn```在执行命令之前,我们需要创建一个 Recordset 对象来存储查询结果。
Recordset 对象可以看作是一个二维表,其中包含了从数据库中返回的数据。
以下是创建 Recordset 对象的代码:```vbDim rs As New ADODB.Recordsetrs.Open cmd, , adOpenStatic, adLockReadOnly```在获取了数据库查询结果后,我们可以使用 rs 对象来访问这些数据。
ADO数据库操作
ADO数据库操作在ADO(ActiveX Data Objects)中,可以使用各种方法和属性来执行数据库操作。
ADO是一种在Microsoft平台上用于访问数据的技术,可以用于连接到各种数据库系统,包括Microsoft Access、SQL Server、Oracle等。
首先,要使用ADO进行数据库操作,我们需要建立与数据库的连接。
可以使用ADO的Connection对象来实现。
例如,对于Microsoft Access 数据库,可以使用以下代码来建立连接:```Dim conn As New ADODB.Connectionconn.ConnectionString ="Provider=Microsoft.Jet.OLEDB.4.0;DataSource=C:\path\to\database.mdb"conn.Open```在上面的代码中,我们创建了一个Connection对象,并设置了连接字符串来指定数据库的路径。
然后,我们调用Open方法来打开连接。
建立连接后,就可以执行各种数据库操作了。
以下是一些常见的数据库操作方法:1.执行SQL查询:```Dim rs As New ADODB.Recordsetrs.Open "SELECT * FROM table", conn```上面的代码中,我们创建了一个Recordset对象,并使用Open方法执行了一个SQL查询。
2.插入记录:```conn.Execute "INSERT INTO table (field1, field2) VALUES ('value1', 'value2')"```上面的代码中,我们使用Execute方法执行了一个插入记录的SQL语句。
3.更新记录:```conn.Execute "UPDATE table SET field1 = 'new value' WHERE condition"```上面的代码中,我们使用Execute方法执行了一个更新记录的SQL语句。
第9章 ADO数据库编程
ConnectionString的常用参数如表所示
参数 Provider Dbq Driver Data Source File Name UID PWD
参数说明 指定OLE DB数据提供者 指定数据库的物理路径 指定数据库的驱动程序(数据库类型) 指定数据源 指定连接的数据库的名称 指定连接数据源时的用户ID 指定连接数据源时该用户的密码
ADO定义了一个可编 程的对象集,主要包括
Connection、Recordset、 Command、Parameter、 Field、Property和Error 等共7个对象,对象模型 如图所示。
Connection
Errors
Errors
Command
Parameters
Parameter
Recordset
Set 连接变量=Nothing
3.使用Connection对象与指定数据源的连接的一般步骤 如下:
(1)创建Connection对象变量; (2)设置Connection对象变量的ConnectionString属性值; (3)用Connection对象变量的Open方法实现与数据源的 物理连接;
ADO以OLE DB为基础,对OLE DB底层操作的复杂接口 进行封装,使应用程序通过ADO中极简单的COM接口,就 可以访问来自OLE DB数据源的数据,这些数据源包括关系 及非关系数据库、文本和图形等。
应用程序
ADO
Microsoft OLE DB Provider for
Jet
SQL Server
ADO数据库编程
ADO数据库编程(1)Connection对象(链接)Connection对象代表应用程序与数据源的一个连接,ADO的Connection对象封装了OLE DB的数据源对象(Data Source)和会话对象(Session)。
Connection对象是ADO 的基本对象之一,它独立于所有其他的对象。
在访问数据库时。
首先建立一个Connection对象,通过它建立到数据库的连接(2)Command(命令)对象Command对象代表一个命令,可以通过该对象的方针对数据源有关操作,比如查询,修改等。
Command(命令)对象封装了OLE DB的命令对象(Command)。
利用该对象可以执行不同种类的命令,可以使用Command对象执行查询并返回Recordset对象中的记录,也可以执行不返回记录集的命令,还可以执行存储过程等。
(3)Recordset(记录集)对象Recordset对象封装了OLE DB 的行集对象(Rowset)。
Recordset对象代表一个表的记录集或者查询命令执行的结果,在记录集中,总是有一个当前的记录。
记录集是ADO噶unlishujude基本对象,所有的Recordset对象都按照行列方式的表状结构进行管理,每一行对应一个记录(Record),每一列对应一个域(Field)。
(4)Field(域)对象每个Field对象对应于Recordset对象中的一列。
Recordset对象中包含了一个用于处理记录集中各列的域对象集合(Fields)。
在记录集返回的每一列中,这个域的集合中都有一个相应的域对象与此列相应,每个域对象中封装了记录集对象的一列。
使用Field对象的集合,方法和属性可以获得字段名,字段数据以及字段的其他基本特征。
域对象只能在记录集对象访问,不能独立存在。
2 数据类型转换ADO是基于COM的技术,COM中使用的数据类型和C++中是不同的。
在用ADO编程时,就需要考虑其数据类型和C++数据类型之间的转换的问题。
Visual C++大学教程第12章 ADO数据库编程
表12.1 Connection对象属性表
属 性 描 述 属性为读/写,并且其值可以为AdXactCommitRetaining和AdXactAbortRetaining中的任意一个或 多个 该属性允许由于网络拥塞或服务器负载过重产生的延迟而取消 Execute 方法调用。指示在终止 尝试和产生错误之前执行命令期间需等待的时间 该属性包含用来建立到数据源的连接的信息。通过传递包含一系列由分号分隔的 argument = value 语句的详细连接字符串可指定数据源 如果由于网络拥塞或服务器负载过重导致的延迟使得必须放弃连接尝试时,使用该属性,指示在 终止尝试和产生错误前建立连接期间所等待的时间 该属性允许在提供者可用的各种游标库中进行选择。通常,可以选择使用客户端游标库或位于服 务器上的某个游标库。设置或返回游标引擎的位置 设置或返回指定Connection对象上默认数据库的名称 表示Connection对象的隔离级别。IsolationLevel 的属性为读/写。直到下次调用BeginTrans方 法时,该设置才可以生效 可设置或返回当前连接上提供者正在使用的访问权限。Mode属性只能在关闭Connection对象时方 可设置 设置或返回连接提供者的名称 确定指定对象的当前状态。该属性是只读的 表示ADO版本号
PageSize
RecordCount Sort Source State Status
Recordset对象属性表
描 述
根据其在Recordset中的序号位置移动到记录,或确定当前记录的序号位置 确定在其上将执行指定Command对象或打开指定Recordset的Connection对象 表示当前记录位置位于Recordset对象的第1个记录之前 表示当前记录位置位于Recordset对象的最后一个记录之后 保存当前记录的位置并随时返回到该记录 控制提供者在缓存中所保存的记录的数目,并可控制一次恢复到本地内存的记录数 允许在可用于提供者的各种游标库中进行选择 指定打开Recordset对象时应该使用的游标类型
第7章ADO对象与数据库操作
第7章ADO对象与数据库操作ADO(ActiveX Data Objects)是一种用于访问数据库的技术,它允许开发者通过编程方式连接到数据库,并执行各种数据库操作。
ADO对象是ADO技术的核心,开发者可以使用ADO对象来连接到数据库,并执行查询、插入、更新和删除等数据库操作。
本章将详细介绍ADO 对象以及其在数据库操作中的应用。
ADO对象分为三个级别:连接级别、命令级别和记录级别。
连接级别的ADO对象用于连接到数据库,命令级别的ADO对象用于执行SQL语句,记录级别的ADO对象用于处理查询结果。
在连接级别中,最重要的ADO对象是连接对象(Connection Object)。
连接对象用于建立与数据库的连接。
使用连接对象,开发者可以指定连接字符串、打开和关闭连接,以及设置连接的属性和选项。
连接字符串是连接对象的重要参数,它用于指定数据库的位置、登录名和密码等信息。
连接字符串的格式因数据库类型而异,以下是一个连接SQL Server数据库的连接字符串示例:```vba"Provider=SQLOLEDB;Data Source=myServerAddress;Initial Catalog=myDatabase;User Id=myUsername;Password=myPassword;"```连接对象的打开和关闭方法可用于连接到数据库和断开与数据库的连接。
打开连接时,ADO对象将尝试与数据库建立连接;关闭连接时,ADO 对象将断开与数据库的连接。
连接对象的属性和选项用于设置连接的行为和特性,例如超时时间、数据提供程序和事务支持等。
设置这些属性和选项可以影响到数据库操作的执行效率和结果。
命令对象的Execute方法用于执行SQL语句,返回查询结果或受影响的记录数。
开发者可以通过参数化查询来避免SQL注入等安全问题,并提高查询的性能。
命令对象还可以设置一些属性,如超时时间、是否使用缓存和命令类型等。
Access-VBA数据库编程(ADO)-详细
Code=rsStudents.Fields(0)
2021/10/10
12
7.3 引用记录字段
[例7-1] 建立名为ADO的模块,编写如下过程。运 行该过程后,输出对话框显示“导师”表中第一 位教师的编号和姓名。
2021/10/10
13
7.3 引用记录字段
记录集更多的应用是在窗体对象上:建立一个空 白窗体→设计各个控件→编程引用记录集当前记 录的相关字段或将字段的值通过控件显示
Private Sub Command3_Click() rsTeacher.MoveNext If rsTeacher.EOF Then rsTeacher.MoveFirst End If
End Sub
方法2:若记录 集的EOF属性为 True,则回到末 记录
Private Sub Command3_Click() rsTeacher.MoveNext If rsTeacher.EOF Then rsTeacher. MoveLast End If
rsStudents.Close cnGraduate.Close Set rsStudents=Nothing Set cnGraduate=Nothing
上述语句不是必须的。应用程序终止运行时,系 统会自动关闭并清除这两个对象。
2021/10/10
11
7.3 引用记录字段
任何对记录集的访问都是针对当前记录进行的。 打开记录集时默认的当前记录为第1条记录。
Recordset记录集的BOF和EOF属性用于判断记录指针 是否处于有记录的正常位置
➢ 记录指针将指向最后一条记录之后,EOF属性为True ➢ 记录指针将指向第一条记录之前,BOF属性为True ➢ BOF和EOF属性的值均为True,表示记录集为空
第9章C#使用ADO进行数据库编程
9.1.2 数据库设计
▪ 2. users(用户表) • 表users用于保存系统所有的用户信息
9.1.2 数据库设计
▪ 3. scores(电影评价表) • 表scores用于保存系统所有的评价信息
9.2 窗体设计部分
❖ 整个FSS项目,划分成主要的6个任务来完成,首先是窗体 的设计,然后是各个窗体代码的完成。
9.2 窗体设计部分
❖ 任务9.1 任务实施
▪ (一)在Visual Studio中建立Winform项目 • (2) 新建FSS项目
– 建立起项目后的Visual Studio界面,如图9-9所示。
9.2 窗体设计部分
❖ 任务9.1 任务实施
▪ (二)系统登录窗体模块 • (1) 系统登录模块概述
C# 程序设计
第9章 使用进行数据库编程
目录
பைடு நூலகம்
1
9.1 概
述
2
9.2 窗体设计部分
3
9.3 代码设计部分
第9章 使用进行数据库编程
❖ 本章以一个简单的访问数据库的Windows应用程序为例, 向读者介绍框架的结构,C#数据库访问的常用 方法,以及相关数据库访问对象和控件的常用属性和方法 。
9.1.1 项目概述
❖ “电影荐评系统”的流程图如图9-2所示。
9.1.2 数据库设计
❖ 要完成对电影和电影评价的保存,还要记录登录的用户信 息,这个简单的系统需要三张数据表来完成数据的保存。 系统的表结构如下:
▪ 1. filmintro(电影介绍表) • 表filmintro用于保存系统所有的电影信息
9.2 窗体设计部分
❖ 任务9.1 任务实施
▪ (三)“导航”窗体模块 • (2) 添加新的窗体
基于ADO的数据库程序设计
• 数据库连接 • 数据查询 • 数据操作 • 数据绑定与显示 • ADO错误处理 • ADO与数据库设计模式
01
数据库连接
ADO简介
01
ADO(ActiveX Data Objects)是微软提供的一种用于访问数 据库的对象模型。
02
它提供了一组对象,包括Connection、Command、
错误处理示例
01
Set rs = CreateObject("ADODB.Recordset")
02
conn.Open "Provider=SQLOLEDB;Data
Source=server_name;" & _
03
"Initial Catalog=db_name;User
ID=user_name;Password=password;"
ORDER BY子句:用于对结果 集进行排序。
JOIN操作:用于将多个表中的 数据联接在一起。
执行SQL语句
创建连接
使用ADO的Connection对象建立与数据库的连接。
创建命令
使用ADO的Command对象执行SQL语句。
执行命令
通过调用Command对象的Execute方法执行SQL 语句。
3
连接字符串的格式可能因数据库的类型和版本而 有所不同。
数据库连接字符串
常见的参数包括
Provider(指定使用的OLE DB提供程序)、Data Source(指 定要连接的数据库服务器或文件路径)、User ID(指定用于连 接到数据库的用户名)和Password(指定用于连接到数据库的 密码)等。
使用ADO数据库编程
使用ADO数据库编程ADO(ActiveX Data Object)是Microsoft数据库应用程序开发的新接口,是建立在OLE DB之上的高层数据库访问技术。
ADO非常简单易用,甚至比ODBC API、DAO、RDO都要容易使用,并不失灵活性。
本节将讨论如何使用ADO进行数据库的开发,介绍ADO库定义文件,讨论用Connection对象连接数据库、通过Connection、Command对象执行SQL 命令及利用Recordset对象取得结果记录集进行查询、处理,下面分别介绍。
1.1 导入ADO的动态链接库用#import指令引入ADO类型库,在使用的文件中加入如下语句#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF") 这句话的作用是编译的时候系统会为我们生成msado15.tlh,ado15.tli两个头文件来定义ADO库,即加载ADO动态库(msado15.dll)。
其中,no_namespace表明不使用命名空间,rename("EOF","adoEOF")表明把ADO中用到的EOF改为adoEOF,防止发生命名冲突。
几点说明:❑该代码需要在一行中完成,如果写成两行或者多行,行末要加上“”符号,表示把这几行看成一行。
❑读者的编程环境中msado15.dll不一定在这个目录下,请按实际情况修改。
❑在编译的时候可能会出现warning C4146警告,对此微软在MSDN中作了说明,并建议不要理会这个警告。
1.2 初始化ADO控件环境ADO库是一组COM动态库,这意味应用程序在调用ADO前,必须初始化OLE/COM 库环境。
初始化OLE/COM库环境的代码如下:::CoInitialize(NULL); /*初始化OLE/COM库环境*/ 别忘了最后要释放资源:::CoUninitialize();/*释放程式占用的COM 资源*/ 如果需要界面支持可以通过另外一个函数实现。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
10、邦定数据定义一个绑定类,将其成员变量绑定到一个指定的记录集,以方便于访问记录集的字段值。
(1). 从cadorecordbinding派生出一个类:class ccustomrs : public cadorecordbinding{begin_ado_binding(ccustomrs)ado_variable_length_entry2(3, advarchar, m_szau_fname,sizeof(m_szau_fname), lau_fnamestatus, false)ado_variable_length_entry2(2, advarchar, m_szau_lname,sizeof(m_szau_lname), lau_lnamestatus, false)ado_variable_length_entry2(4, advarchar, m_szphone,sizeof(m_szphone), lphonestatus, true)end_ado_binding()public:char m_szau_fname[22];ulong lau_fnamestatus;char m_szau_lname[42];ulong lau_lnamestatus;char m_szphone[14];ulong lphonestatus;};其中将要绑定的字段和变量名用begin_ado_binding宏关联起来。
每个字段对应于两个变量,一个存放字段的值,另一个存放字段的状态。
字段用从1开始的序号表示,如1,2,3等等。
特别要注意的是:如果要绑定的字段是字符串类型,则对应的字符数组的元素个数一定要比字段长度大2(比如m_szau_fname[22],其绑定的字段au_fname的长度实际是20),不这样绑定就会失败。
我分析多出的2可能是为了存放字符串结尾的空字符null和bstr字符串开头的一个字(表示bstr的长度)。
这个问题对于初学者来说可能是个意想不到的问题。
cadorecordbinding类的定义在icrsint.h文件里,内容是:class cadorecordbinding{public:stdmethod_(const ado_binding_entry*, getadobindingentries) (void) pure;};begin_ado_binding宏的定义也在icrsint.h文件里,内容是:#define begin_ado_binding(cls) public: \typedef cls adorowclass; \const ado_binding_entry* stdmethodcalltype getadobindingentries() { \static const ado_binding_entry rgadobindingentries[] = {ado_variable_length_entry2宏的定义也在icrsint.h文件里:#define ado_variable_length_entry2(ordinal, datatype, buffer, size, status, modify)\{ordinal, \datatype, \0, \0, \size, \offsetof(adorowclass, buffer), \offsetof(adorowclass, status), \0, \classoffset(cadorecordbinding, adorowclass), \modify},#define end_ado_binding宏的定义也在icrsint.h文件里:#define end_ado_binding() {0, adempty, 0, 0, 0, 0, 0, 0, 0, false}};\return rgadobindingentries;}(2). 绑定_recordsetptr rs1;iadorecordbinding *picrs=null;ccustomrs rs;......rs1->queryinterface(__uuidof(iadorecordbinding),(lpvoid*)&picrs));picrs->bindtorecordset(&rs);派生出的类必须通过iadorecordbinding接口才能绑定,调用他的bindtorecordset方法就行了。
(3). rs中的变量即是当前记录字段的值//set sort and filter condition:// step 4: manipulate the datars1->fields->getitem("au_lname")->properties->getitem("optimize")->value = true;rs1->sort = "au_lname asc";rs1->filter = "phone like 415 5*";rs1->movefirst();while (variant_false == rs1->endoffile){printf("name: %s\t %s\tphone: %s\n",(u_fnamestatus == adfldok ? rs.m_szau_fname : ""),(u_lnamestatus == adfldok ? rs.m_szau_lname : ""),(rs.lphonestatus == adfldok ? rs.m_szphone : ""));if (rs.lphonestatus == adfldok)strcpy(rs.m_szphone, "777");testhr(picrs->update(&rs)); // add change to the batchrs1->movenext();}rs1->filter = (long) adfilternone;......if (picrs) picrs->release();rs1->close();pconn->close();只要字段的状态是adfldok,就能访问。
如果修改了字段,不要忘了先调用picrs的update (注意不是recordset的update),然后才关闭,也不要忘了释放picrs(即picrs->release();)。
(4). 此时还能用iadorecordbinding接口添加新纪录if(failed(picrs->addnew(&rs)))......11. 访问长数据在microsoft sql中的长数据包括text、image等这样长类型的数据,作为二进制字节来对待。
能用field对象的getchunk和appendchunk方法来访问。
每次能读出或写入全部数据的一部分,他会记住上次访问的位置。
不过如果中间访问了别的字段后,就又得从头来了。
请看下面的例子://写入一张照片到数据库:variant varchunk;safearray *psa;safearraybound rgsabound[1];//vt_array │ vt_ui1cfile f("h:\\aaa.jpg",cfile::moderead);byte bval[chunksize+1];uint uisread=0;//create a safe array to store the array of byteswhile(1){uisread=f.read(bval,chunksize);if(uisread==0)break;rgsabound[0].celements =uisread;rgsabound[0].llbound = 0;psa = safearraycreate(vt_ui1,1,rgsabound);for(long index=0;index<uisread;index++){if(failed(safearrayputelement(psa,&index,&bval[index])))::messagebox(null,"啊,又出毛病了。
","提示",mb_ok │ mb_iconwarning);}varchunk.vt = vt_array│vt_ui1;varchunk.parray = psa;try{m_precordset->fields->getitem("photo")->appendchunk(varchunk);}catch (_com_error &e){cstring str=(char*)e.description();::messagebox(null,str+"\n又出毛病了。
","提示",mb_ok │ mb_iconwarning); }::variantclear(&varchunk);::safearraydestroydata( psa);if(uisread<chunksize)break;}//while(1)f.close();//从数据库读一张照片:cfile f;f.open("h:\\bbb.jpg",cfile::modewrite│cfile::modecreate);long lphotosize = m_precordset->fields->item["photo"]->actualsize;long lisread=0;_variant_t varchunk;byte buf[chunksize];while(lphotosize>0){lisread=lphotosize>=chunksize? chunksize:lphotosize;varchunk = m_precordset->fields->item["photo"]->getchunk(lisread);for(long index=0;index<lisread;index++){::safearraygetelement(varchunk.parray,&index,buf+index);}f.write(buf,lisread);lphotosize-=lisread;}//while()f.close();12. 使用safearray问题学会使用safearray也是非常重要的,因为在ado编程中经常要用。