第15章 ODBC实例介绍
ODBC开放式数据库互联PPT教学课件

2020/12/11
8
ODBC API(4)
ODBC应用程序流程
初始化阶段
分配环境句柄 分配连接句柄
• 在分配连接句柄前,最好先设置环境句柄所用的ODBC参数
建立连接 分配语句句柄
程序主体
结束部分
释放语句句柄
断开数据源连接
释放连接句柄
2020/12/11
9
释放环境句柄
ODBC API(4)—什么是句柄
2020/12/11
3
ODBC开放数据库互连
开放数据库互连(Open Database Connectivity,ODBC)是微软公司开放服 务结构(WOSA,Windows Open Services Architecture)中有关数据库的一个组成部
分,它建立了一组规范,并提供了一组对 数据库访问的标准API(应用程序编程接 口)。这些API利用SQL来完成其大部分任 务。ODBC本身也提供了对SQL语言的支持, 用户可以直接将SQL语句送给ODBC。
2020/12/11
6
ODBC API(1)
理论上,为了互操作,所有DBMS提供的ODBC 调用函数和SQL语句应该完全一致?不可能
驱动程序的一致性级别((Conformance Levels)
API一致性:核心级、扩展1级、扩展2级 语法一致性:最低限度SQL语法级、核心SQL语法级、
扩展SQL语法级
户所需要的各种数据管理的方式。数据库
有很多种类型,从最简单的存储有各种数
据的表格到能够进行海量数据存储的大型
数据库系统都在各个方面得到了广泛的应
用。 2020/12/11
2
严格地说,数据库是“按照数据结构来 组织、存储和管理数据的仓库”。在经济 管理的日常工作中,常常需要把某些相关 的数据放进这样的“仓库”,并根据管理 的需要进行相应的处理。例如,企业或事 业单位的人事部门常常要把本单位职工的 基本情况(职工号、姓名、年龄、性别、籍 贯、工资、简历等)存放在表中,这张表就 可以看成是一个数据库。有了这个"数据仓 库"我们就可以根据需要随时查询某职工的 基本情况,也可以查询工资在某个范围内 的职工人数等等。
vc之ODBC连接数据库图文全解

vc之ODBC连接数据库图文全解我们在编程时要保存各种实时接收的数据,并为以后的数据再现回放,就应该建立数据文件,而这种数据文件可以用普通文件读写方式,但当数据类型较多且要求随时回放数据时,要求编程时设置较大的动态数组,这会占用较多的系统资源,甚至导致程序崩溃;而利用数据库则可以较好地解决这个问题,我们将数据放到数据源文件中,通过编程接口对其进行访问。
ODBC(开放的数据库连接:Open Database Connectivity)为各种类型的数据库管理系统提供了统一的编程接口,我们在下面的几篇文章中,首先通过实例说明ODBC技术的应用方法,然后说明如何将串口数据实时保存在数据源文件中,这一方面介绍VC中ODBC技术的应用(前面的例子不涉及串口技术,以方便只想了解ODBC技术的读者,又为利用ODBC技术保存串口编程数据提供范例,虽然前面几个例程与串口通讯不相关,但如果对使用数据库不熟悉,也请从前面有耐心地看下去。
1.首先在控制面板中,打开ODBC数据源,点击用户DSN选项,在出现的界面中点击添加,如下图所示:然后,点击完成按钮,出现下图,填入数据源名(可随意取名,本处设为biao)点击确定即可。
2.在ACCESS中创建数据库,本例中为data(只包含number,name,score三列),可从我提供的这个例子下COPY3.建立应用程序项目(1)打开File 菜单的New 选项,选取Projects,选择MFC AppWizard (exe),填入工程名,本例为DATA1(2)把数据库文件data拷入新建的工程目录。
(3)应用程序的类型指定为SDI,在Step2 对话框中选择Header Files Only选项,在Step6是将视图基类指定为CScrollView。
(4)用ClassWizard 创建记录集类。
从Add Class菜单中选择New,并按下图填充对话框:(说明:一个CRecordset对象代表从数据源中查询的一个记录集。
odbc 例子 sqlprocedurecolumns -回复

odbc 例子sqlprocedurecolumns -回复Title: An In-depth Guide to ODBC Example: SQLProcedureColumnsIntroduction:In today's data-intensive world, efficient and seamless data integration is crucial for businesses. One popular method for integrating data and databases is through ODBC (Open Database Connectivity). ODBC allows various applications to access and manipulate data from different database management systems using a standardized interface. In this article, we will explore the ODBC example SQLProcedureColumns, discussing its purpose, functionality, and implementation step-by-step.Section 1: Understanding ODBC and SQLProcedureColumns- Introduction to ODBC: Explain the concept of ODBC and its importance in data integration. Highlight its advantages such as cross-platform compatibility and driver-based connectivity.- SQLProcedureColumns: Introduce SQLProcedureColumns as a system procedure, designed to retrieve information about stored procedures and their parameters from a database. Discuss how it provides metadata about the stored procedures' columns, their data types, and other details.Section 2: Step-by-step Implementation of SQLProcedureColumns 1. Prerequisites:- Explain the necessary prerequisites for implementing SQLProcedureColumns, such as having a compatible database system and the appropriate ODBC driver installed.2. Connecting to the database:- Describe the process of establishing a connection to the database using an ODBC connection string. Cover the configuration steps, including specifying the data source name (DSN), username, password, and other relevant parameters.3. Executing SQLProcedureColumns:- Provide a code snippet demonstrating how to execute SQLProcedureColumns using ODBC functions. Discuss the required SQL syntax and parameters.4. Retrieving the result set:- Illustrate how to retrieve the result set returned by SQLProcedureColumns. Explain the role of ODBC functions such as SQLFetch and SQLGetData in fetching and accessing the data.5. Processing the result set:- Walk through the steps involved in processing the result set to extract meaningful information. Explain how to traverse the rowsand columns to obtain various details about stored procedures and their parameters.6. Handling errors and exceptions:- Discuss error handling techniques when executing SQLProcedureColumns. Highlight the importance of error checking using ODBC functions like SQLGetDiagRec to provide meaningful feedback and troubleshoot issues.Section 3: Use Cases and Best Practices1. Use cases:- Explore various scenarios where SQLProcedureColumns can be beneficial. For example, explain how it can assist developers in understanding the structure of stored procedures and their parameters when integrating with third-party applications or creating data reports.2. Best Practices:- Provide recommendations and best practices for utilizing SQLProcedureColumns effectively. Emphasize the importance of regular maintenance, updating the ODBC driver, and documenting changes in the stored procedures.Conclusion:In this article, we have explored the ODBC example SQLProcedureColumns, its purpose, and how to implement it step-by-step. By executing SQLProcedureColumns, developers can retrieve metadata about stored procedures within a database, making it easier to integrate them with various applications. With ODBC's versatility and cross-platform compatibility, this functionality provides a streamlined approach to accessing and manipulating data across diverse database management systems. Understanding and leveraging SQLProcedureColumns can greatly enhance businesses' ability to manage and integrate their data effectively.。
odbc

1 利用ODBC可以统一FoxPro、Access或Oracle数据库的方式处理.2 应用程序要访问一个数据库,首先必须用ODBC管理器注册一个数据源,管理器根据数据源提供的数据库位置、数据库类型及ODBC驱动程序等信息,建立起ODBC与具体数据库的联系。
这样,只要应用程序将数据源名提供给ODBC,ODBC就能建立起与相应数据库的连接。
3 以microsoft access为例,如果在c:\myfile\文件夹里创建了一个名为myexample.mdb的数据库文件,其注册步骤如下:在控制面板里找到“odbc数据源”图标,打开数据源管理器的交互界面;笔者创建的数据库文件是供本机上的用户使用的,所以这里选择“用户dsn”;然后按下“添加”按钮,在弹出的数据源管理器对话框里,为自己所要创建的数据源选择一个驱动程序,本文的数据库文件是用microsoft access创建的,所以要选择“microsoft access driver (*.mdb)”;按“完成”按钮后,进入一个标题为“odbc microsoft access 安装”的界面,在其中设置“数据源名”为“mydatasource”,选取数据库文件“c:\myfile\myexample.mdb”,然后确定即可。
Oracle这样我们就完成了一个简单的odbc数据源的注册。
当然,在以上的步骤中,用户可以根据自己的不同需要,设置不同的选项odbc数据源是用来进行从网站到数据库之间的连接提供一个方便的桥梁,当用户的数据需要在网页前台上进行显示的时候这就要用到odbc数据源,让网站能够调用后台的数据库中的数据....在控制面板里,选择管理工具---odbc数据源选择驱动安装,你的数据库可以是oracle,或者acess,或者sql等,odbc数据源中都提供了相关的驱动程序,选择你的数据库的类型,进行你的驱动的安装,就可以了.....新建一个数据库,里面会有连接一项。
编程实例——ODBC篇

达梦接口编程实例——ODBC篇ODBC(Open Database Connectibvity)是被人们广泛接受的用于数据库访问的标准API(应用程序编程接口)。
对于数据库API,它以X/Open和ISO/IEC的Call-Level Interface(CLI)规范为基础,并使用结构化查询语言(SQL)作为其数据库访问语言。
结构化查询语言SQL是一种用来访问数据库的语言。
通过使用ODBC,应用程序能够使用相同的源代码和各种各样的数据库交互。
这使得开发者不需要以特殊的数据库管理系统DBMS为目标,或者了解不同支撑背景的数据库的详细细节,就能够开发和发布客户/服务器应用程序。
达梦数据库(DM DATABASE,以下简称DM)的DM ODBC 3.0遵照Microsoft ODBC 3.0规范设计与开发,实现了ODBC应用程序与DM的互连接口。
用户可以直接调用DM ODBC 3.0接口函数访问DM,也可以使用可视化编程工具如Visual C++、C++ Builder、PowerBuilder等利用DM ODBC 3.0访问DM。
本文中以武汉达梦数据库公司的DM ODBC 3.0驱动程序为实例,以Visual C++为工具,在Windows 2000 Professional操作系统上,用一个实例来介绍DM ODBC的编程方法。
1、创建DM ODBC数据源在DM客户端软件安装过程中,如果选择了安装ODBC驱动程序的相关选项,安装工具可完成将DM ODBC 3.0驱动程序复制到硬盘,并在Windows注册表中登记DM ODBC驱动程序信息的工作。
在使用DM ODBC方法访问一个DM数据库服务器之前,必须先对自己的应用程序所用的ODBC资源进行配置。
在客户机上配置DM ODBC资源的步骤如下:1.1依次打开控制面板-管理工具-数据源(ODBC),显示ODBC数据源管理器对话框,如图1.1.1所示。
图1.1.1 ODBC数据源管理器对话框1.2设置和配置一个系统DSN,请单击系统DSN标签,单击添加按钮增加一个新的DSN,显示如图1.1.2所示的对话框。
ODBC详解

下面对上述步骤做详细的介绍。
5.2.1步骤1:连接数据源
为了连接数据源,必须要建立一个数据源连接的环境句柄。通过调用SQLAllocEnv函数实现对环境句柄的分配,在ODBC 3.0里,这个函数已经被SQLAllocHandle取代,但是熟悉ODBC API的开发人员还是习惯用这个函数建立环境句柄,因为VC++开发平台有一个映射服务,这个服务将程序代码对函数SQLAllocEnv的调用转向对函数SQLAllocHandle的调用。
通过调用如下代码可以通过应用程序动态创建数据源MYDB:
BOOL CreateDSN()
{
char* szDesc;
int mlen;
szDesc=new char[256];
sprintf(szDesc,"DSN=%s: DESCRIPTION=TOC support source: \
DBQ=%s: FIL=MicrosoftAccess: \
{
//执行其它操作
…………
}
retcode = :: SQLExecute (hstmt, (UCHAR*)pszSQL, SQL_NTS );
if(rcode == SQL_SUCCESS) // SQL语句执行成功
{
//执行其它操作
…………
}
5.2.4步骤4:获取结果集
SQL语句执行成功以后,应用程序必须准备接收数据,应用程序需要把SQL语句执行结果绑定到一个本地缓存变量里。但是SQL执行语句执行的结果并不是直接传送给应用程序,而是在应用程序准备接收数据的时候通知驱动程序其已经准备好接收数据,应用程序通过调用SQLFetch函数返回结果集的一行数据。
ODBC介绍
ODBC介绍一、什么是ODBCODBC(Open Database Connectivity)是“开放式数据库互连”的简称,由微软提出,是一种使用SQL的应用程序接口(API),用户可以添加数据库驱动程序,将您的应用程序链接到自己的数据库管理系统。
ODBC的最大优点是能以统一的方式处理所有的数据库,用它生成的程序与数据库无关。
二、ODBC驱动1.查看系统所安装的ODBC驱动程序:“开始”/“设置”/“控制面板”/“管理工具”/“数据源 (ODBC)”/“驱动程序”。
2.若系统所安装的ODBC驱动程序里没有你想要的ODBC驱动,如Oracle的ODBC驱动,只需正常的安装ORACLE软件,系统会自动的将ORACLE对应的驱动程序加载到ODBC驱动程序里面。
三、数据源1.创建数据源“开始”/“设置”/“控制面板”/“管理工具”/“数据源 (ODBC)”/“添加”数据源添加完成后,名称项下的所有项都为已创建好的数据源。
2. 配置数据源(修改数据源名、说明及所指数据库)“开始”/“设置”/“控制面板”/“管理工具”/“数据源 (ODBC)”/“配置”根据选择的数据源,单击“配置”会打开数据源所对应的配置窗口(如下图)。
3. 删除数据源“开始”/“设置”/“控制面板”/“管理工具”/“数据源 (ODBC)”/“删除”选择将要删除的数据源,单击“删除”,出现删除确认窗口,选择“是”则成功删除所选择的数据源。
实例1:为SQL数据库(FXBBDATA.MDB)创建ODBC数据源。
1、“开始”/“设置”/“控制面板”/“管理工具”/“数据源 (ODBC)”,出现“ODBC数据源管理器”窗口2、单击“添加”按钮,选择SQL驱动程序,单击“完成”3、出现“创建到SQL Server 的新数据源”窗口,输入数据源名称、描述、选择要连接到的SQL Server服务器,单击“下一步”4、出现“创建到SQL Server的新数据源”窗口,设置完后单击“下一步”注意:若在此处选择“使用用户输入登录ID和密码的SQL Server 验证”。
ODBC数据库接口的介绍
ODBC数据库接口的介绍什么是ODBCMcrosoft推出的ODBC(Open Database Connectivity)技术为异质数据库的访问提供了统一的接口。
ODBC基于SQL(Structured Query Language),并把它作为访问数据库的标准。
这个接口提供了最大限度的相互可操作性:一个应用程序可以通过一组通用的代码访问不同的数据库管理系统。
一个软件开发者开发的客户/服务器应用程序不会被束定于某个特定的数据库之上。
ODBC可以为不同的数据库提供相应的驱动程序。
ODBC的灵活性表现在以下几个方面:♦应用程序不会受制于某种专用的API;♦ SQL语句以源代码的方式直接嵌入在应用程序中;♦应用程序可以以自己的格式接收和发送数据;♦ ODBC的设计完全和ISO Call-Level Interface兼容;♦现在的ODBC数据库驱动程序支持55家公司的数据产品;ODBC的名词术语ODBC驱动程序:是一个动态链接库(DLL),用以将特定的开放式数据库连接的数据源和另一个应用程序(客户端)相连接。
ODBC数据源:作为数据源使用的数据库或数据库服务器。
ODBC数据源通过它们的数据源名称来引用,或者通过具体引用ODBC驱动程序和服务器名称来引用。
可以在Windows的控制面板中使用ODBC 管理程序或rdoRegisterDataSource(一个ODBC API)方法来注册命名的数据源。
ODBC驱动程序管理器:提供从主机语言到特定后端数据源驱动程序的接口。
ODBC API:数据库厂商为程序设计者提供的直接访问数据库的一组函数。
注意:这里要指出的是,虽然ODBC API提供了很多很方便而且强大的功能。
但是ODBC API都比较难学,而且使用很容易出错。
虽然允许用ODBC API来操作ODBC句柄,如果不正确使用ODBC API,可能会导致不可预知的错误。
配置ODBC数据源ODBC管理器(Administrator)它负责安装驱动程序,管理数据源,并帮助程序员跟踪ODBC的函数调用。
数据库接口技术——ODBC
ODBC的产生 的产生
PKU
1991年11月,微软宣布了ODBC,次年推出 可用版本. 1992年2月,推出了ODBC SDK 2.0版. ODBC基于SAG的SQL CAE草案所规定的语法, 共分为Core,Level 1, Level 2三种定义, 分别规范了22,16,13共51条命令,其中 29条命令甚至超越了SAG CLI中原有的定义, 功能强大而灵活.它还包括标准的错误代 码集,标准的连接和登录DBMS方法,标准 的数据类型表示等.
数据源的组成
PKU
数据
数据源
网络环境
操作系统
DBMS
ODBC的接口函数 的接口函数
PKU
I. 连接数据源(Connecting to a Data Source)
SQLAllocEnv SQLAllocConnect SQLConnect SQLPriverConnect SQLBrowseConnect
II. 取得驱动程序及数据源的相关讯息
SQLDataSource SQLGetInfo SQLGetFunctions SQLGetTypeInfo.
III. 设定及取得驱动程序的选项
SQLSetConnectOption SQLGetConnectOption SQLSetStmtOption SQLGetStmtOption.
PKU
应用程序
Application
驱动程序管理器
Drive manager
驱动程序
Drive
数据源
Data sourse
应用程序层
PKU
使用ODBC接口的应用程序可执行以下任务: 使用ODBC接口的应用程序可执行以下任务: ODBC接口的应用程序可执行以下任务
c语言之odbc编程指南
摘要本文在介绍了ODBC(开放性数据库连接,Open DataBase Co nnectivity)运行机制的基础上,着重讨论了VisualC++2.0下利用ODBC API及利用MFC进行ODBC编程的两种方法.关键词ODBC,SQL,数据源,文档/视图结构,DBMS一、ODBC的发展背景在传统的数据库领域,数据库应用程序通常是指在特定的数据库管理系统(DBMS)的支持下,用特定的内嵌式结构化查询语言(SQL)开发的.这样的数据库应用程序存在如下的缺点:(1)它往往需要一个庞大的数据库管理系统的支持,对用户的软、硬件要求高;(2)它通常只能处理一种格式的数据库文件.与传统的数据库应用程序的实现方法相比,Microsoft的开放性数据库连接(ODBC)标准则提供了一种新的途径:它建立了一组规范,并提供了一组高层应用程序调用接口和一套基于动态链接库(DLL)的运行支持环境.用这样一组接口规范开发的应用程序,使用标准的函数和结构化查询语言(SQL)对数据库进行操作,不必关心"数据源"(DataSourc e)来自何种数据库管理系统DBMS,所有的数据库的底层操作都是由相应的ODBC驱动程序(ODBCDriver)完成.只要有了相应的ODBC驱动程序,应用程序处理的对象-数据源就可以非常广泛,既可以是本机的某种数据库格式的文件,如FoxPro的*.dbf文件,也可以是远程数据库文件,如MicrosoftSQLServer等.二、ODBC的运行机制ODBC的体系构架包括五个部分:ODBC管理器(ODBCAdministrator)、应用程序(Application)、ODBC驱动程序管理器(ODBCDriver Mana ger)、ODBC驱动程序(ODBCDriver)和数据源(Data Source).图1表示了ODBC各部分之间的关系.ODBC管理器在整个ODBC运行机制中起配置环境、登录信息的作用,它被安装在Control Pannel里(ODBCINST.CPL).通过该工具,可以用来配置、增添和删除数据源,也可以用来删除、安装ODBC驱动程序.OD BC管理器把数据源和ODBC驱动程序的信息记录在ODBC.INI、ODBCINST.INI和ODBCISAM.INI中,或者登录在系统数据库中,ODBC的其他部件通过读取这些信息,相互作用,应用程序就能够实现对已登录数据库的共享.应用程序(Application)的主要任务是通过调用标准的ODBC函数, 提交SQL语句并返回结果,对结果进行处理.ODBC驱动程序管理器的作用是根据应用程序的要求,调用不同的ODBC驱动程序.ODBC驱动程序的作用是实现ODBC函数调用,对指定的数据源执行SQL语句,并把结果返回给应用程序.有时候,为了符合特定的数据库管理系统的语法,ODBC驱动程序还会对应用程序的要求作适当修改.这里,ODBC驱动程序的作用与运行在Windows下的打印机驱动程序的作用非常相似.数据源,由用户要访问的数据及与之相关的操作系统、数据库管理系统和用于访问数据库管理系统所需的网络平台组成.对应用程序而言,ODBC驱动程序管理器和ODBC驱动程序就像一个实现ODBC函数调用的整体单元,应用程序感觉不到它们之间的分工合作关系.整个ODBC的结构是基于一种独特的动态链接库DLL而存在的,它使得系统完全模块化了.三、利用ODBC API的C语言ODBC编程下面以一个典型ODBC数据库访问程序的伪代码为例,说明用ODBCAPI的C语言进行ODBC编程的一般步骤.该程序从用户接受SQL查询语句,然后获取结果,集中各行各列的数据.HENV henvHDBChdbcHSTMThstmtint nColsSQLALLocEnv(&henv)/*环境申请,获得一个环境句柄*/SQLAllocConnect(henv,&hdbc)/*连接申请,获得数据库连接句柄*/SQLDriverConnect(hdbc,…)/*与具体的ODBC驱动程序和数据源联系*/SQLAllocStmt(hdbc,&hstmt)/*语句申请,获得一个语句句柄*/Input SQLStatement/*从用户接受SQL语句*/SQLExecDirect(hstmt,SQLStatement,…)/*执行SQL语句*/SQLNumResultCols(hstmt,&nCols)/*获取结果集中列数*/for each column{/*获得每列的信息,并与相应的C变量联系起来*/SQLDescribeCol(hstmt,col,ColName,…)/*获取当前列的信息*/ SQLBindCol(hstmt,col,…,variable,…)/*与相应变量联系起来*/}for each row{/*获取结果集中每行每列的数据,并作相应的处理*/SQLFetch(hstmt)/*将当前行的数据存储在SQLBindCol指定的变量中,当前行在结果集中后向下滚动一行*/foreach column{process field data from column variable}}SQLfreeStmt(hstmt,…)/*释放SQL语句句柄*/SQLDisconnect(hdbc)/*断开当前的连接*/SQLFreeConnect(hdbc)/*释放当前数据库连接句柄*/SQLFreeEnv(henv)/*释放环境句柄*/当编写C程序对ODBC数据库进行访问时,必须了解三个非常重要的概念:环境(environment)、连接(connection)、语句(statement).和其他的C语言Windows程序一样,它们都是通过句柄(handle)来访问的.首先需要一个环境句柄,如上面伪代码所示,它建立了应用程序与ODBC系统之间的联系,一个应用程序通常只有一个环境句柄.下一步需建立一个或多个链接,它建立了驱动程序与数据源之间的特定组合关系.如果在函数SQLDriverConnect(hdbc,…,strConnect ,…)中提供了如下的输入字符串,DSN=COMPONEN;FIL=FOXPRO2.6而且ODBC管理器中路径及配置正确的话,该函数就能自动建立起连接来.环境和连接获得后,最后还需要一个SQL语句来实施具体的数据库操作,它可以是如下形式的查询语句:SELECT NAME,AGE,SEX,GRADE FROMSTUDENT WHERE SEX=′F′也可以是如下的更新语句:UPDATE STUDENTSETAGE=′24′WHERE NAME=′JIANG QIN G SONG′四、利用MFC的C++语言ODBC编程VisualC++2.0对ODBCAPI进行了封装,封装后,最重要的数据库MFC类有CDatabase、CRecordset和CRecordView类.尤其是CRecordset类, 它一方面与CDatabase类的对象进行数据交换,另一方面又与CRecordView类进行数据交换,是CDatabase类和CRecordView类之间的桥梁.它们之间的作用关系如图2所示.实际上,CDatabase类的每个对象代表了一个数据源的连接,适宜于对数据源下的某个表格进行整体操作;CRecordset类的每个对象代表了记录的集合,这个集合是对指定数据表格按预定的查询条件获得的,它适宜于对所选的记录集合进行操作;CRecordView类的每个对象是与之相联系CRecordset类对象的外部表现形式,它的作用是把rdset类对象的变化以一些标准Windows控制的形式表现出来,是主要的用户界面.在应用编程时,根据问题的复杂程度和要求,可采用两种不同的方法来实现.如果仅仅是对某指定的数据库进行一些简单的操作,如向数据库中追加、删除、更改一些特定的记录等,并且不需要显示数据库的这些变化的话,就可以采用第一种方法,仅仅利用CDatabase类的相关功能来实现.这种方法只需两步就可完成:1.调用CDatabase类的打开(Open)函数,进行数据源的实际连接.2.调用CDatabase类的成员函数ExecuteSQL,执行一条SQL语句,实现特定的数据库操作.下面InsertRecord函数是实现向数据源compone n的表COMPONEN中插入一行记录,记录的TYPE字段的值为"pump"的最简代码.void InsertRecord(){CDatabase m-db;m-db.Open(NULL,FALSE,FALSE,″ODBC;DSN=componen″);m-db.ExecuteSQL(″insertinto COMPONEN(TYPE)value(′pump ′)″);m-db.Close();然而,在实际编程中,这种情况很少,多数数据库应用程序不仅要实现复杂得多的数据库操作,还需要显示变化了的数据库的情况,这样就需要用到VisualC++的文档/视图结构,需要CDatabase、CRecordset 、CRecordView和CDocument类之间相互配合来实现.下面以VisualC++2.0的AppWizard和ClassWizard产生的一个实际工程test.mak为例,说明这些类是如何相互作用的.工程test.mak的数据源是componen的COMPONEN表,该表的结构如表1所示.test.exe要实现的功能是按默认的条件查询COMPONEN表,滚动记录集,并在屏幕上显示当前记录集中的当前记录.有关的代码如下所示:表1COMPONEN的结构class CTestSet:public Crecordset{public:CTestSet(CDatabase*pDatabase=NULL);DECLARE-DYNAMIC(CTestSet)//{{AFX-FIELD(CTestSet,CRecordset)CStringm-NAME;CString m-CATALOGID;CStringm-SIZE;CStringm-ORDERID;CString m-PRODUCER;//}}AFX-FIELD//{{AFX-VIRTUAL(CTestSet)public:virtual CStringGetDefaultConnect();//Default connection stringvirtual CString GetDefault//default SQLfor Recordsetvirtual void DoFieldExchange(CFieldExchange*pFX);//RFX support//}}AFX-VIRTUAL……};CStringCTestSet::GetDefaultConnect(){return-T(″ODBC;DSN=componen;″);}CStringCTestSet::GetDefaultSQL(){return-T(″COMPONEN″);}void CTestSet::DoFieldExchange(CFieldExchange*pFX){//{{AFX-FIELD-MAP(CTestSet)pFX->SetFieldType(CFieldExchange::outputColumn);RFX-Text(pFX,″NAME″,m-NAME);RFX-Text(pFX,″CATALOGID″,m-CATALOGID);RFX-Text(pFX,″SIZE″,m-SIZE);RFX-Text(pFX,″ORDERID″,m-ORDERID);RFX-Text(pFX,″PRODUCER″,m-PRODUCER);/*以下是参数连接部分,m-nParams必须先被赋值为2.这段代码仅仅是为了说明如何参数化查询条件而设置,test.mak中没有这几行代码.pFX->SetFieldType(CFieldExchange::param);RFX-Text(pFX,″NAMEParam″,m-strNAMEParam,20);RFX-Text(pFX,″CATALOGIDParam″,m-strCATALOGIDParam,10);*///}}AFX-FIELD-MAP}class CTestDoc:public Cdocument{……public:CTestSet m-testSet;public:……};class CTestView:public CRecordView{……public://{{AFX-DATA(CTestView)enum{IDD=IDD-TEST-FORM};CTestSet*m-pSet;//}}AFX-DATA//Attributespublic:CTestDoc*GetDocument();……public://{{AFX-VIRTUAL(CTestView)public:virtual CRecordset*OnGetRecordset();protected:virtual void DoDataExchange(CDataExchange*pDX(;//DDX/DDVsupportvirtual void OnInitialUpdate();//called firsttime after construct//}}AFX-VIRTUAL};void CTestView::DoDataExchange(CDataExchange*pDX){CRecordView::DoDataExchange(pDX);//{{AFX-DATA-MAP(CTestView)DDX-FieldText(pDX,IDC-EDIT-CATALOGID,m-pSet->m-CATALOGID,m-pSet);DDX-FieldText(pDX,IDC-EDIT-NAME,m-pSet->m-NAME,m-pSet);DDX-FieldText(pDX,IDC-EDIT-ORDERID,m-pSet->m-ORDERID,m-pSet);DDX-FieldText(pDX,IDC-EDIT-PRODUCER,m-pSet->m-PRODUCER,m-pSet);DDX-FieldText(pDX,IDC-EDIT-SIZE,m-pSet->m-SIZE,m-pSet);//}}AFX-DATA-MAP}CRecordset*CTestView::OnGetRecordset(){return m-pSet;}CTestDoc*CTestView::GetDocument(){ASSERT(m-pDocument->IsKindOf(RUNTIME-CLASS(CTestDoc)));return(CTestDoc*)m-pDocument;}void CTestView::OnInitialUpdate(){m-pSet=&GetDocument()->m-testSet;CRecordView::OnInitialUpdate();}分析以上代码要从CTestView类开始.依照VC标准的文档/视图结构的相互作用关系,记录视图类CRecordView的导出类CTestView,在显示前要调用它的成员函数OnInitialUpdate(),弄清函数CTestView::O nInitialUpdate()在这里的行为是理解整个代码的关键.下面是CTest View::OnInitialUpdate()函数调用关系图:CTestView::OnInitialUpdate()CRecordView::OnInitialUpdate()//调用基类的OnInitialUpdate()函数CTestView::OnGetRecordset()//得到一个CRecordset类的指针CRecordset::Open()//利用前面得到的指针访问Open函数CTestSet::GetDefaultConnect()//得到默认连接字符串CDatabase::Open()//利用默认连接字符串与数据源连接CTestSet::GetDefaultSQL()//得到默认SQL语言,执行它CFormView::OnInitialUpdate()//调用CForm View::OnInitial UpdateCTestView::DoDataExchange()//与Windows编辑控制联系起来通过以上分析,我们知道,表面上只有CRecordset、CRecordView和CDocument类的导出类之间相互作用,实际上,由于CRecordset::Ope n()函数要构造一个CDatabase类指针,并通过默认连接字符串与特定的数据源连接,仍然是四个类之间相互作用的,只不过是VC的标准框架将这种关系封装起来罢了.补充说明几点:·对当前记录集中当前记录的滚动功能,应用程序中不需要任何代码支持,VC的标准框架默认实现了.·CRecordset::Open()是如何构造一个完整的SQL查询语句、如何理解CRecordset类工作机制的关键.一个完整的SQL查询语句具有下面的普遍形式:SELECT[ALL|DISTINCT]columnlist FROMtablelist[WHEREsearchcondition][ORDER BYcolumnlist[ASC|DESC]][]内的内容表示是可选的,|表示"或者".CRecordset::Open()构造这样的SQL查询语句的伪代码如下所示:CRecordset::Open(…,lpszSQL…){IF(lpszSQL!=NULL)strSQL=lpszSQLELSEstrSQL=CRecordSet::GetDefaultSQL()IF(strSQL不以"SELECT"或"CALL}"开头){strSQL="SELECTcolumnlist FROMtablelist"其中,columnlist与CRecordSet::DoFieldExchange()中列名保持数量和顺序上的一致;tablelist是前面strSQL的值}IF(m-strFilter!=NULL)strSQL+="WHERE"+m-strFilterIF(m-strSort!=NULL)strSQL+="ORDER BY"+m-strSort}其中,strSQL是保存SQL语句的变量、m-strFilter、m-strSort是CRecordSet类的公有成员变量.CRecordSet类对象中包含的数据就是符合strSQL中查询条件的记录的集合.·程序可以动态改变SQL语句中的查询条件,即参数化WHERE字句和ORDERBY字句.在变量m-strFilter、m-strSort中将要参数化的部分以"?"代替.在调用打开函数CRecordSet::Open()前(如在构造函数中) ,将参数变量的个数赋值给变量m-nParams,并在CRecordSet::DoField Exchange()中按参数出现的先后顺序定义好,如CTestSet::DoFieldEx change()代码中注释部分所示.五、结束语从以上讨论中可知,ODBC应用程序与传统的数据库应用程序相比, 确实有自己独特的优点,它不仅编程接口十分简单方便,更主要的是它的运行机制非常适合与应用程序的其他功能完美地融合.笔者最近利用了ODBC技术,通过ODBC系统读取FoxPro2.6数据库文件中的记录,能够实现液压原理图中元件明细表的自动填充功能,非常方便快捷.。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
15.1.3 结构化查询语言(SQL)
SQL(Structured Query Language,结构化查询 语言)最早由IBM提出,是专门用来处理关系数据 库的基于文本的语言.SQL向数据库提供了完善而 一致的接口,它不是独立的计算机语言,需要 DBMS的支持方能执行.SQL是一种标准的数据库语 言,目前大多数DBMS都支持它.(具体内容请参 照本书)
15.1.2 数据库管理系统(DBMS)
数据库管理系统(Data Base Management System 简称DBMS)是指数据库系统中对数据进行管理的 软件系统,它是数据库系统的核心组成部分,例 如FoxPro,Access,Sybase,SQL Server等都是 DBMS.数据库系统的一切操作,包括查询,更新, 以及各种控制,都是DBMS进行的.
15.4.3 Visual C++程序实现设置ODBC数 据源
为了使ODBC能与数据库一起工作,必须把数据库 注册到ODBC驱动程序管理器,可以使用15.4.1节 介绍的手工配置的方法.但手工配置对用户而言 过于复杂,必须考虑用程序替用户完成这些配置 工作.
15.4.4 使用Visual C++程序设置ODBC数 据源实例
15.3.1 Viusal C++对ADO的支持
Visual C++6.0为ADO操作提供了库支持,一般情 况下,每个Windows操作系统的Program Files\Common Files\System\ado\目录下都有一 个msado*.dll文件,根据Windows版本的不同,该 文件可以是msado1.dll,msado15.dll或 msado2.dll.在使用Visual C++6.0进行ADO编程 时,可以借助Visual C++6.0的import预编译指令, 将该库文件引用到工程里,从而使msado*.dll库 里的数据和函数声明被应用的代码所使用.
在介绍数据库程序开发之前,有必要简单介绍一 下数据库及其管理,使用的相关概念.当然,对 于有一定数据库基础的读者可略过本节.
15.1.1 数据库的基本概念
数据库是数据的集合,它由一个或多个表组成. 每一个表中都存储了对一类对象的数据描述.经 常见到的成绩表就是一种表,它由行和列组成, 并且可以通过名字来识别数据.列包含了列的名 字,数据类型以及列的其他属性;行包含了列的 记录或者数据.
15.3.5 开发技术——连接对象 (Connection)
连接对象表示到数据源的打开的连接,同时也表 示与数据源的唯一会话.通常在使用ADO操作数据 库之前必须首先创建一个连接对象.连接对象为 ADO对数据源的操作提供了一个操作环境,还可以 用于操作事务处理.
15.3.6 创建表并添加数据
在实例中,创建Access数据库时,并没有创建数 据库表.在程序的初始化函数OnInitDialog中, 通过连接对象执行SQL语句创建一个数据库表 studentinfo,该表包含四个字段,分别为stuNo, stuname,stuaddress和stuphone,类型均为TEXT 类型.(具体内容请参照本书)
15.2 数据库开发技术简介
本节简要介绍VisualC++中常用的数据库开发技术, 大致分为三类,即ODBC API/MFC ODBC,DAO以及 ADO.其中,MFC ODBC是MFC对ODBC API的封装, ADO是OLE DB的高层接口.
15.2.1 ODBC API/MFC ODBC技术
第15章 VC数据库编程
Visual C++通过若干种接口来支持关系数据库的 访问,这些接口包括ODBC(开发式数据库连接), RDO(远程数据对象),DAO(数据访问对象), OLE DB和ADO(ActiveX数据对象).这些接口反 映了Micorsoft对数据库支持的发展演化过程.
15.1 数据库基础
介绍了Recordset对象后,下面回到实例的开发. 在前面实现了创建与数据库的连接,数据库表的 创建,和通过Connect对象执行SQL语句向数据库 表中添加记录.在本节,将实现遍历表中的记录, 并能编辑和删除当前显示的记录.
15.4 使用ODBC数据源连接数据库
ODBC为应用程序和数据库系统之间的中间件.它 通过使用相应应用平台上和所需数据库对应的驱 动程序与应用程序的交互来实现对数据库的操作, 避免了在应用程序中直接调用与数据库相关的操 作,从而提供了数据库的独立性. 在实际数据库程序开发中,多将数据库添加到 ODBC数据源,通过ODBC数据源连接数据库,从而 避免直接操作数据库文件.使用ADO也可以实现与 ODBC数据源的连接.本节将主要介绍一下ODBC数 据源的设置与连接.
15.2.2 DAO技术
DAO(Data Access Object,数据访问对象)是第 一个面向对象地接口,该技术最初用于像Access 这样的MicroSoft产品中.DAO依赖于用MicroSoft Access自动获得的MicroSoft Jet数据库引擎.另 外,DAO还是较早版本的Visual Basic所使用的引 擎(最新版的Visual Basic和Visual C++依赖于 相同的ADO/OLE-DB组合),所以如ห้องสมุดไป่ตู้需要支持较 早的Visual Basic应用程序,那么DAO是一个不错 的选择.不过,目前此技术有被OLE DB/ADO取代 地趋势,所以一般也不再使用.
15.3.2 创建数据库与实例工程
实例数据库采用Access2000数据库.启动Access, 执行"文件"→"新建"菜单命令,创建一个空 的数据库Student.mdb.可以在Access中,添加设 计数据库表,也可以在VC程序中通过ADO创建,本 例采用后者.(具体内容请参照本书)
15.3.3 引入ADO对象
ADO是一组动态链接库,因此在使用之前还必须导 入ADO并且初始化.在MFC应用里,一般在应用类 的InitInstance成员函数里初始化OLE/COM库环境 比较合适.初始化过程非常简单,只需简单地调 用AfxOleInit函数即可.(具体内容请参照本书)
15.3.4 连接数据源
在工程中引入ADO对象后,就可以通过Connection 对象连接数据源了.(具体内容请参照本书)
15.4.1 手动实现设置ODBC数据源
ODBC数据源管理器负责安装驱动程序,管理数据 源,并帮助程序员跟踪ODBC的函数调用.ODBC数 据源管理器负责将应用程序的SQL语句及其他信息 传递给驱动程序,而驱动程序则负责将运行结果 送回应用程序.
15.4.2 ADO连接ODBC数据源
设置了ODBC数据源后,ADO的Connection对象就可 以直接通过数据源名studb访问Access数据库 Student.(具体内容请参照本书)
15.3.7 开发技术——ADO对象命令的执 行
在ADO对象中,有两种不同的方法可以执行命令. 第一种方法是调用Connection对象的Execute函数, 在15.3.5节已经介绍过程,实例中使用的也是这 种方法.第二种方法是使用命令对象(Command), 它可用于处理负责的命令和使用参数化命令.本 节将主要讨论第二种方法的使用.(具体内容请 参照本书)
ODBC(Open Database Conectivity,开放式数据 库互联),实际上是一个数据库访问库,它包含 访问不同数据库所要求的ODBC驱动程序.如要操 作Foxpro数据库,要用Foxpro的ODBC驱动程序; 要访问DBASE,要用DBASE的ODBC驱动程序.总之, 应用程序要操作不同类型的数据库,只要调用 ODBC所支持的函数,动态链接到不同的驱动程序 上即可.随着ODBC技术的推出,许多开发工具软 件都把ODBC技术集成到自己的软件中,如, Visual basic,Visual C++,Power Builder等等.
本节给出一个调用动态连接库odbccp32.dll的函 数SQLConfigDataSource注册ODBC数据源的实例程 序.该程序将Student数据库添加至ODBC数据源, 并设置其数据源名称为studb.
�
15.3.8 开发技术——Recordset对象
要访问和操作数据源的数据就需要创建记录集对 象(Recordset).本节将介绍记录集对象的相关 操作,在使用Recordset对象对象前,假定已经成 功建立了数据源的连接,连接对象指针为 m_pConnection.
15.3.9 遍历,删除,编辑记录的实现
15.2.3 ADO技术
ADO,即ActiveX Data Objects,是一种特殊的 OLE DB客户程序,它允许访问程序在Visual C++, Visual Basic,VBscript,Java等编程语言中访 问.ADO是微软大力推荐使用的编程接口,在微软 已经停止对ODBC和DAO继续发展的今天,学习使用 ADO无疑是正确的选择.
15.3 在Visual C++中使用ADO开发数据 库应用程序
在应用程序中,通过ADO和SQL语句的配合,可以 实现对数据库的一系列操作,例如创建数据库, 创建表,创建索引,实现数据库的多重查询,高 级查询和数据的汇总等技术.在本节,将通过一 个具体的实例详细讲解如何在Visual C++中,使 用ADO对象开发数据库应用程序.