77范文网 - 专业文章范例文档资料分享平台

数据库系统原理教案(3)

来源:网络收集 时间:2019-01-07 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

SELECT pr.ProductID, pr.Description, pr.Price AS ProductPrice, pu.PurchasePrice, pu.PurchaseDate

FROM Products pr INNER JOIN Purchases pu ON pr.ProductID = pu.ProductID GO --创建触发器

CREATE TRIGGER tr_vwProductPurchases ON vw_ProductPurchases INSTEAD OF INSERT AS BEGIN

IF EXISTS

(SELECT TOP 1 * FROM INSERTED

WHERE ProductID IS NOT NULL AND

ISNULL(COALESCE(PurchasePrice, ProductPrice),0)>0 )

BEGIN

INSERT INTO Purchases (ProductID, PurchasePrice, PurchaseDate ) SELECT i.ProductID, COALESCE(PurchasePrice, ProductPrice), ISNULL(PurchaseDate, GETDATE()) FROM INSERTED i END ELSE BEGIN

PRINT 'Adequate data not provided.' END END

用下面的语句测试创建的触发器:

INSERT INTO vw_ProductPurchases(ProductID, PurchasePrice) VALUES(1, 700) 在视图上附上INSTEAD-OF触发器后,则允许修改表,但是不需要直接修改表中的数据,使用在vw_ProductPurchases视图上创建一个INSTEAD-OF触发器。INSTEAD OF并不表示在试图进行插入操作之前执行触发器。也不表示在进行插入操作之后执行触发器,表示忘掉插入操作,转而执行触发器中的代码。 二、删除触发器

在标准SQL中不提供修改触发器的语句,但支持对触发器的删除。语句格式是: DROP TRIGGER <触发器名> 例如,

DROP TRIGGER SPJCheck, tr_vwProductPurchases;

5.5 ODBC编程

ODBC(Open DataBase Connectivity)是用高级语言实现的应用程序编程接口,为应用程序提供了从数据库管理系统中访问数据的能力。ODBC的结构包括四个主要部分:应用程序编程接口、驱动器管理器、数据库驱动器和数据源。

ODBC (Open Database Connectivity,开放数据库互连)是微软公司开放服务结构(WOSA,Windows Open Services Architecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口)。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC。

一个基于ODBC的应用程序对数据库的操作不依赖任何DBMS,不直接与DBMS打交

11

道,所有的数据库操作由对应的DBMS的ODBC驱动程序完成。也就是说,不论是FoxPro、Access还是Oracle数据库,均可用ODBC API进行访问。由此可见,ODBC的最大优点是能以统一的方式处理所有的数据库。 (一)ODBC的组成

一个完整的ODBC由下列几个部件组成:(1)应用程序(Application);(2)ODBC管理器(Administrator),该程序位于Windows 95控制面板(Control Panel)的32位ODBC内,其主

数据源名 (DSN) ODBC 管理器 驱动程序 管理器 ODBC 驱动程序 应用 程序 应用层 ODBC API ODBC层 数据层 数据源 图6-1 ODBC部件关系图

要任务是管理安装的ODBC驱动程序和管理数据源;(3)驱动程序管理器(Driver Manager),驱动程序管理器包含在ODBC32.DLL中,对用户是透明的。其任务是管理ODBC驱动程序,是ODBC中最重要的部件(4)ODBC API;(5)ODBC 驱动程序,ODBC驱动程序是一些DLL,提供了ODBC和数据库之间的接口;(6)数据源。数据源包含了数据库位置和数据库类型等信息,实际上是一种数据连接的抽象。各部件之间的关系如图6-1所示。

应用程序要访问一个数据库,首先必须用ODBC管理器注册一个数据源,管理器根据数据源提供的数据库位置、数据库类型及ODBC驱动程序等信息,建立起ODBC与具体数据库的联系。这样,只要应用程序将数据源名提供给ODBC,ODBC就能建立起与相应数据库的连接。

在ODBC中,ODBC API不能直接访问数据库,必须通过驱动程序管理器与数据库交换信息。驱动程序管理器负责将应用程序对ODBC API的调用传递给正确的驱动程序,而驱动程序在执行完相应的操作后,将结果通过驱动程序管理器返回给应用程序。 (二)在C++中的ODBC API数据库编程

(1) 动态加载数据源:

① 通过修改注册表加载数据源:

用户数据源:HKEY_CURRENT_USER\\SOFTWARE\\ODBC\\ODBC.INI 系统数据源:HKEY_LOCAL_MACHINE\\SOFTWARE\\ODBC\\ODBC.INI

对于不同类型的数据源,注册表的修改也不同,但基本上要修改两个地方,一个是在ODBC.INI子键下建立一个与数据源描述名同名的子键,并在该子键下建立与数据源配置相关的项;另一个是在\\ODBC.INI\\ODBC Data Sources子键下建立一个新项以便告诉驱动程序管理器ODBC数据源的类型。

② 通过ODBC API加载:Windows系统子目录下的动态链接库Odbcinst.dll提供了一个可以动态增加、修改和删除数据源的函数SQLConfigDataSource,由于VC的默认库文件中不包含此函数,因此使用前需将Odbcinst.h文件包含在工程的头文件中,在工程的setting属性框Link页的Object/library module编辑框中增加Odbc32.lib,同时保证系统目录system32下有文件Odbccp32.dll。

12

③ 文件数据源的连接:除了ODBC管理器,还可以通过SQLDriverConnect来添加文件数据源。

(2) ODBC API编程

如果一个ODBC API函数执行成功,则返回SQL_SUCCESS或SQL_SUCCESS_WITH_INFO,SQL_SUCCESS指示可通过诊断记录获取有关操作的详细信息,SQL_SUCCESS_WITH_INFO指示应用程序执行结果带有警告信息,可通过诊断记录获取详细信息。如果函数调用失败,返回码为SQL_ERROR。

一般,编写ODBC程序主要有以下几个步骤:

① 分配环境句柄:声明一个SQLHENV的变量,调用函数SQLAllocHandle。

设置环境属性:完成环境分配后,用函数SQLSetEnvAttr设置环境属性,注册ODBC版本号。

释放环境句柄:完成数据访问任务时,应调用SQLFreeHandle释放前面分配的环境。 ② 分配连接句柄:声明一个SQLHDBC类型的变量,调用SQLAllocHandle函数分配句柄。

设置连接属性:所有连接属性都可通过函数SQLSetConnectAttr设置,调用函数SQLGetConnectAttr可获取这些连接属性的当前设置值。

③ 连接数据源:对于不同的程序和用户接口,可以用不同的函数建立连接

SQLConnect:该函数只要提供数据源名称、用户ID和口令,就可以进行连接了。 SQLDriverConnect:该函数用一个连接字符串建立至数据源的连接,它可以让用户输入必要的连接信息,使用系统中还没定义的数据源。

SQLBrowseConnect:该函数支持以一种迭代的方式获取到数据源的连接,直到最后建立连接,它基于客户机/服务器体系结构,因此本地数据库不支持该函数。

④ 准备并执行SQL语句

A、分配语句句柄:语句句柄是通过调用SQLAllocHandle函数分配的。

函数SQLGetStmrrAttr和SQLSetStmrrAttr用来获取和设置一个语句句柄的选项,使用完,调用SQLFreeHandle释放该句柄。

B、执行SQL语句

SQLExecDirect:该函数直接执行SQL语句,对于只执行一次的SQL语句来说,该函数是执行最快的方法。

SQLPrepare和SQLExecute:对于需要多次执行的SQL语句来说,可先调用SQLPrepare准备SQL语句的执行,用SQLExecute执行准备好的语句。

C、使用参数:使用参数可以使一条SQL语句多次执行,得到不同的结果。 函数SQLBindParameter负责为参数定义变量,将一段SQL语句中的一个参数标识符(\?\捆绑在一起,实现参数值的传递。

⑤ 获取记录集

A、绑定列:首先必须分配与记录集中字段相对应的变量,然后通过函数SQLBindCol将记录字段同程序变量绑定在一起,对于长记录字段,可以通过调用函数SQLGetData直接取回数据。

绑定字段可以根据自己的需要全部绑定,也可以绑定其中的某几个字段。 通过调用函数SQLBindCol将变量地址值赋为NULL,可以结束对一个记录字段的绑定,通过调用函数SQLFreeStmt,将其中选项设为SQL_UNBIND,或者直接释放句柄,都会结束所有记录字段的绑定。

B、SQLFetch:该函数用于将记录集的下一行变成当前行,并把所有捆绑过的数据字段的数据拷贝到相应的缓冲区。

13

C、光标:应用程序获取数据是通过光标(Cursor)来实现的,在ODBC中,主要有3种类型的光标:单向光标、可滚动光标和块光标。

有些应用程序不支持可滚动光标和块光标,ODBC SDK提供了一个光标库(ODBCCR32.DLL),在应用程序中可通过设置连接属性(SQL_STTR_ODBC_CURSOR)激活光标库。

⑥ 记录的添加、删除和更新:数据源数据更新可通过3种方式:通过SQLExecDirect函数使用相应的SQL语句;调用SQLSetPos函数实现记录集定义更新;调用SQLBulkOperations函数实现数据更新。

第一种方式适用于任何ODBC数据源,后两种方式有的数据源不支持,可调用SQLGetInfo确定数据源。

SQLBulkOperations:该函数操作基于当前行集,调用前,须先调用SQLFetch或SQLFetchScroll获取。

函数调用后,块光标的位置变为未定义状况,因此,应该先调用函数SQLFetchScroll设定光标位置。

⑦ 错误处理:每个ODBC API函数都能产生一系列反映操作信息的诊断记录,可以用SQLGetDiagField函数获取诊断记录中特定的域,另外,可以使用SQLGetDiagRec获取诊断记录中一些常用的域。

⑧ 事务处理:事务提交有两种方式:自动提交模式和手动提交模式。应用程序可通过调用函数SQLSetConnectAttr设定连接属性SQL_ATTR_AUTOCOMMIT,自动提交模式是默认的连接属性设置,对于所有的ODBC驱动程序都能适应这种模式下,所有语句都是作为一个独立的事务进行处理的。

手动提交模式把一组SQL语句放入一个事务中,程序必须调用函数SQLEenTran明确地终止一个事务。若使用多个激活的事务,就必须建立多个连接,每一个连接包含一个事务。

⑨ 断开数据连接并释放环境句柄:完成数据库操作后,可调用SQLDisconnect函数关闭同数据库的连接。

例如,利用ODBC函数访问数据库 #include #include #include #include #include main() {

HENV henv; /*说明henv是一个环境型变量*/ HDBC hdbc; /*说明hdbc是一个连接型变量*/ HSTMT hstmt; /*说明hstmt是一个语句句柄变量*/ RETCODE retcode; /*说明retcode是一个返回变量*/ SQLAllocEnv(&henv); /*分配一个环境语句*/ SQLAllocConnect(henv,&hdbc); /*分配一个连接句柄*/ SQLConnect(hdbc,\学生\ /*连接数据库源*/ SQLAllocStmt(hdbc,&hstmt); /*分配一个语句句柄*/

retcode=SQLExecDirect(hstmt,\ /*直接执行SQL语句*/

14

?? /*结果集处理*/ SQLDisconnect(hdbc); /*断开数据源*/

SQLFreeStmt(hstmt,SQL_DROP); /*释放一个语句句柄*/ SQLFreeConnect(hdbc); /*释放一个连接句柄*/

SQLFreeEnv(henv); /*当应用完成后,释放环境句柄*/ }

15

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库数据库系统原理教案(3)在线全文阅读。

数据库系统原理教案(3).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/408857.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: