朴素Paxos算法通过多轮的Prepare/Accept过程来确定一个值,Lamport称这整个过程为一个Instance。Multi-Paxos是通过Paxos算法来确定很多个值,而且这些值的顺序在各个节点完全一致。概括来讲就是确定一个全局顺序。
多个Instance怎么运作?首先我们先构建最简易的模式,各个Instance独立运作下面的例子引自知乎 Paxos理论介绍(2): Multi-Paxos与Leader 的Multi-Paxos部分。
但这样效率是比较差的,众所周知朴素Paxos算法的Latency很高,Multi-Paxos算法希望找到多个Instance的Paxos算法之间的联系,从而尝试在某些情况去掉Prepare步骤。
下面我尝试描述一个Sample的演进情况来阐述这个算法,因为这个算法的要点其实非常简单,而且无需更多证明。
首先我们定义Multi-Paxos的参与要素:
下图描述了A/B/C三个节点并行提交的演进过程:
这种情况下NodeA节点几乎每个Instance都收到其他节点发来的Prepare,导致Promise编号过大,迫使自己不断提升编号来Prepare。这种情况并未能找到任何的优化突破口。
下图描述了只有A节点提交的演进过程:
这种情况我们会立刻发现,在没有其他节点提交的干扰下,每次Prepare的编号都是一样的。于是乎我们想,为何不把Promised(b)变成全局的?来看下图:
假设我们在Instance i进行Prepare(b),我们要求对这个b进行Promise的生效范围是Instance[i, ∞),那么在i之后我们就无需在做任何Prepare了。可想而知,假设上图Instance 1之后都没有任何除NodeA之外其他节点的提交,我们就可以预期接下来Node A的Accept都是可以通过的。那么这个去Prepare状态什么时候打破?我们来看有其他节点进行提交的情况:
Instance 4出现了B的提交,使得Promised(b)变成了2(B), 从而导致Node A的Accept被拒绝。而NodeA如何继续提交?必须得提高自己的Prepare编号从而抢占Promised(b)。这里出现了很明显的去Prepare的窗口期Instance[1,3],而这种期间很明显的标志就是只有一个节点在提交。
不Prepare直接Accept为啥是安全的
在一个Leader提交proposal的前提下,不会有其他Proposer提交,那么就不会出现Acceptor promised的最大编号大于proposal中所带编号的情况,同样也不会出现Acceptor accept的编号大于proposal中所带编号的情况。因此这么做是安全的。
不Prepare直接Accept有什么好处
To achieve this, the round number I is included along with each value which is incremented in each round by the same Leader. Multi-Paxos reduces the failure-free message delay (proposal to learning) from 4 delays to 2 delays. 这句不太会翻译,但大概的意思应该就是:Multi-Paxos通过改变Promised(b)的生效范围至全局的Instance,从而使得一些唯一节点的连续提交获得去Prepare的效果。
下面是知乎文章中介绍的一个方法,个人感觉这个没有一个标准的设计,暂时参考这个。
为何还要说Leader,虽然Multi-Paxos允许并行提交,但这种情况下效率是要退化到朴素Paxos的,所以我们并不希望长时间处于这种情况,Leader的作用是希望大部分时间都只有一个节点在提交,这样才能最大发挥Mulit-Paxos的优化效果。
怎么得到一个Leader,真的非常之简单,Lamport的论文甚至的不屑一提。我们观察Multi-Paxos算法,首先能做Accept(b)必然是b已经被Promised了,而连续的Accept(b)被打断,必然是由于Promised(b)被提升了,也就是出现了其他节点的提交(提交会先Prepare从而提升b)。那么重点来了,如何避免其他节点进行提交,我们只需要做一件事即可完成。
收到来自其他节点的Accept,则进行一段时间的拒绝提交请求。
这个解读起来就是各个节点都想着不要去打破这种连续的Accept状态,而当有一个节点在连续的Accept,那么其他节点必然持续不断的拒绝请求。这个Leader就这样无形的被产生出来了,我们压根没有刻意去“选举”,它就是来自于Multi-Paxos算法。
用Paxos算法来进行选举是有意义的,但不应该用在Leader上面。Paxos的应用除了写之外,还有很重要的一环就是读,很多时候我们希望要读到Latest,通常的做法就是选举出一个Master。Master含义是在任一时刻只能有一个节点认为自己是Master,在这种约束下,读写我都在Master上进行,就可以获得Latest的效果。Master与Leader有本质上的区别,要达到Master这种强一致的唯一性,必须得通过强一致性算法才能选举出来。而当我们实现了Paxos算法后,选举Master也就变得非常简单了,会涉及到一些租约的东西,后面再分享。
Multi-Paxos实际上是Basic Baxos的多instance执行。下图是一个初始的Leader(实际上是一个Proposer)执行一次Basic Baxos的过程。
where V = last of (Va, Vb, Vc).
在这个case中,接下来的instance(第I+1个instance)都使用的同一个Leader,因此直接跳过了phase1(接下来instance中Basic Paxos协议的phase 1,即省略prepare阶段),其中Leader应该是稳定的,不能宕机或者故障。
A common deployment of the Multi-Paxos consists in collapsing the role of the Proposers, Acceptors and Acceptors to "Servers". So, in the end, there are only "Clients" and "Servers". 意思就是Proposers,Acceptors,Acceptors没有明确的角色区分,统称为Servers。Server可以扮演以上三种任何角色,这样部署起来就只有Clients和Servers区分。
固定Leader之后,且角色合并成了Server跟Client。
摘 要图书管理系统是典型的信息管理系统(MIS),其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。对于前者要求建立起数据一致性和完整性强、数据安全性好的库。而对于后者则要求应用程序功能完备,易使用等特点。因此本人结合开入式图书馆的要求,对MS SQL Server2000数据库管理系统、SQL语言原理、Delphi应用程序设计,Delphi数据库技术进行了较深入的学习和应用,主要完成对图书管理系统的需求分析、功能模块划分、数据库模式分析,并由此设计了数据库结构和应用程序。系统运行结果证明,本文所设计的图书管理系统可以满足借阅者、图书馆工作人员和高级管理员三方面的需要。第五章进行了具体的程序设计,具体划分了三类用户的操作权限,设计了了三个操作界面。实现了数据库表的浏览,记录的添加、删除和修改,报表的生成,实现了多数据库表的连接操作,实现了多条件查询和模糊查询,并灵活实现了对不可更新查询结果集的更新操作,实现了主从表操作,实现了密码维护功能,最后,系统还可以导入数据库以对任意同结构的数据库进行操作。设计充分利用Delphi 6、MS SQL Server2000数据库技术的强大力量,提高了编程效率和可靠性。关键词:数据库,SQL语言,MS SQL Server,Delphi6,数据库组件,图书管理,窗体,listview组件第一章 绪 论§ 数据库应用系统开发简介在数据库应用系统开发之前,对开发数据库的基本概念应当了解,对数据库的结构、开发数据库应用程序的步骤、开发体系及方法都应当有相当清晰的了解和认识。数据库应用系统开发的目标是建立一个满足用户长期需求的产品。开发的主要过程为:理解用户的需求,然后,把它们转变为有效的数据库设计。把设计转变为实际的数据库,并且这些数据库带有功能完备、高效能的应用。数据库技术在计算机软件邻域研究中一直是非常重要的主题,产生于60年代,30多年来数据库技术得到了迅速发展,并已形成较为完整的理论体系和一大批实用系统。并且,近年来,随着World Wide Web(WWW)的猛增及Internet技术的迅速发展,使得数据库技术之时成为最热门技术之一。 数据库如图显示了数据库系统的主要组件。数据库由DBMS(数据库管理系统)处理,DBMS则由开发人员和用户通过应用程序直接或间接地使用。它主要包括四个要素:用户数据、元数据、索引和应用元数据。 用户数据目前,大多数主流数据库管理系统把用户数据表示为关系。现在把关系看作数据表。表的列包含域或属性,表的行包含对应业务环境中的实体的记录。并非所有的关系都同样符合要求,有些关系比其它关系更结构化一些。第二章描述了一个用以产生良好结构关系的过程,称作规范化。为了对比结构差的关系和结构好的关系之间的差别,以本文所设计的图书管理系统中的图书和图书借阅者关系为例来说明,假若设计关系R1(借书证号,姓名,性别,身份编号,身份证,联系电话,图书编号,图书名称,图书类别,作者,出版社,出版日期,备注,价格,数量);这个关系的问题出在它有关于两个不同主题的数据,就是图书借阅者和图书。用这种方式构成的关系在进行修改时,会出现问题。因为一个图书借阅者可能借阅多本书,如果某个图书借阅者的某个字段(如联系电话)出现变更,它所借阅的图书记录(可能多个)也就必须变化,这是不好的。因此数据用两个关系表示更好。现在如果某图书借阅者改变了它的联系电话,只有关系(表)user的对应行需要改变。当然,要想产生一个,显示图书名称及其借阅者联系电话的报表,就需要将这两个表的行结合起来。结果表明,将关系分别存储,在生成报表的时候将它们结合起来,比把它们存储在一个合成的表中更好。user(借书证号,姓名,性别,身份编号,身份证,联系电话,)book(图书编号,图书名称,图书类别,作者,出版社,出版日期,备注,价格,数量) 元数据数据库是自描述的,这就意味着它自身包含了它的结构的描述,这种结构的描述称作元数据。因为DBMS产品是用来存储和操纵表的,所以大多数产品把元数据以表的形式存储,有时称作系统表。这些系统表存储了数据库中表的情况,指出每一个表中有多少列,那一列是主关键字,每一列的数据类型的描述,它也存储索引、关键字、规则和数据库结构的其他部分。在表中存储元数据不仅对DBMS是有效的,对用户也是方便的,因为他们可以使用与查询用户数据同样的查询工具来查询元数据。本文第二章所介绍的SQL语言可以同时用于元数据和用户数据。 索引第三种类型的数据改进了数据库的性能和可访问性,这种数据经常称作开销数据,尽管有时也采用其他类型的数据结构,如链表,但它主要还是索引。索引可以用来排序和快速访问数据。下面以本人的图书管理信息系统中的book表为例来说明。假定数据在磁盘上是按’图书编号’的递增顺序排列的,用户想打印一个按’图书名称’排序的图书数据报表。为此,所有的数据都需要从源表中提取出来并排序,除非表很小,否则这是一个很费时的过程。或者,可以在‘图书名称’字段上创建一个索引,该索引的条目按照‘图书名称’排序,这样,该索引的条目可以读出来,并用来按顺序访问book数据。索引用于快速访问数据。例如,一个用户只想访问book表中‘图书类别’值为‘01’的那些学生。如果没有索引,则必须搜索整个源表;但有了索引之后,可以找到索引条目,并使用它来挑选所有合适的行。索引对排序和查找是有帮助的,但要付出代价。book表中的行每次改变时,索引也必须改变,这意味着索引并非随意的,应该在真正需要时保存。 应用元数据存储在数据库中的第四种数据是应用元数据,它用来存储用户窗体、报表、查询和其他形式的查询组件。并非所有的DBMS都支持应用组件,支持组件的DBMS也不一定把全部组件的结构作为应用元数据存储在数据库中。然而,大多数现代的DBMS产品存储这种数据作为数据库的一部分。一般来说,数据库开发人员和用户都不直接访问应用元数据,想反,他们通过DBMS中的工具来处理这些数据。MS SQL Server2000中就支持窗体、存储过程等应用元数据。 数据库管理系统数据库管理系统(DBMS)是指数据库系统中管理数据的软件系统。DBMS是数据库系统的核心组成部分。对数据库的一切操作,包括定义、更新及各种控制,都是通过DBMS进行的。DBMS总是基于某种数据模型,可以把DBMS看成是某种数据模型在计算机系统上的具体实现。根据数据模型的不同,DBMS可以分成层次型、网状型、关系型、面向对象型等。MS SQL Server2000就是一种关系型数据库管理系统。关系模型。关系模型主要是用二维表格结构表达实体集,用外键表示实体间联系。关系模型是由若干个关系模式组成的集合。关系模式相当于前面提到的记录类型,它的实例称为关系,每个关系实际上是一张二维表格。关系模型和层次、网状模型的最大判别是用关键码而不是用指针导航数据,表格简单用户易懂,编程时并不涉及存储结构,访问技术等细节。关系模型是数学化模型。SQL语言是关系数据库的标准化语言,已得到了广泛的应用。如图所示,DBMS的特点和功能可以分为三个子系统:设计工具子系统、运行子系统和DBMS引擎。设计子系统有一个方便数据库及其应用创建的工具集。它典型地包含产生表、窗体、查询和报表的工具。DBMS产品还提供编程语言和对编程语言的接口。运行子系统处理用设计子系统开发的应用组件。它所包含的运行处理器用来处理窗体和数据库的数据交互,以及回答查询和打印报表等。DBMS引擎从其他两个组件接受请求,并把它们翻译成对操作系统的命令,以便读写物理介质上的数据。DBMS引擎还涉及事务管理、锁、备份和恢复。 创建数据库 数据库模式数据库模式定义了数据库的结构、表、关系、域和业务规则。数据库模式是一种设计,数据库和应用正是建立在此基础上的。域是一列可能拥有的值的集合。必须为每一个表的每一列确定域。除了数据的物理格式外,还需要确定是否有些域对表来说是唯一的。数据库模式的最后一个要素是业务规则,它是对需要反映在数据库和数据库应用程序中的业务活动的约束。业务规则是模式的一个重要部分,因为他们指定了无论什么数据变化到达DBMS引擎,允许的数据值必须满足的约束。不管无效的数据变化请求是来自窗体的用户、查询/修改请求还是应用程序,DBMS都应该拒绝。遗憾的是,不同的DBMS产品用不同的方法实施业务规则。在某些情况下,DBMS产品不具备实施必要业务规则的能力,必须以代码形式把它们编入应用程序。 创建表 定义联系 应用组件数据库应用包括窗体、查询、报表、菜单和应用程序。§ 图书管理系统当今时代是飞速发展的信息时代。在各行各业中离不开信息处理,这正是计算机被广泛应用于信息管理系统的环境。计算机的最大好处在于利用它能够进行信息管理。使用计算机进行信息控制,不仅提高了工作效率,而且大大的提高了其安全性。尤其对于复杂的信息管理,计算机能够充分发挥它的优越性。计算机进行信息管理与信息管理系统的开发密切相关,系统的开发是系统管理的前提。本系统就是为了管理好图书馆信息而设计的。图书馆作为一种信息资源的集散地,图书和用户借阅资料繁多,包含很多的信息数据的管理,现今,有很多的图书馆都是初步开始使用,甚至尚未使用计算机进行信息管理。根据调查得知,他们以前对信息管理的主要方式是基于文本、表格等纸介质的手工处理,对于图书借阅情况(如借书天数、超过限定借书时间的天数)的统计和核实等往往采用对借书卡的人工检查进行,对借阅者的借阅权限、以及借阅天数等用人工计算、手抄进行。数据信息处理工作量大,容易出错;由于数据繁多,容易丢失,且不易查找。总的来说,缺乏系统,规范的信息管理手段。尽管有的图书馆有计算机,但是尚未用于信息管理,没有发挥它的效力,资源闲置比较突出,这就是管理信息系统的开发的基本环境。数据处理手工操作,工作量大,出错率高,出错后不易更改。图书馆采取手工方式对图书借阅情况进行人工管理,由于信息比较多,图书借阅信息的管理工作混乱而又复杂;一般借阅情况是记录在借书证上,图书的数目和内容记录在文件中,图书馆的工作人员和管理员也只是当时对它比较清楚,时间一长,如再要进行查询,就得在众多的资料中翻阅、查找了,造成查询费时、费力。如要对很长时间以前的图书进行更改就更加困难了。基于这此问题,我认为有必要建立一个图书管理系统,使图书管理工作规范化,系统化,程序化,避免图书管理的随意性,提高信息处理的速度和准确性,能够及时、准确、有效的查询和修改图书情况。§ 系统所做工作1) 了解应用开发工具的现状2) 编程基础3) MS SQL Server基础4) 设计数据库;设计界面5) 开发数据库。数据库实现的一些功能有l 数据和数据说明的醒目显示;l 多条件的查询、多条记录的检索、模糊查询;l 数据文件某种存储格式导入数据窗体,经过数据完整性校验存入数据库;l 数据库安全性的设计;l 数据库的设计、数据接口、界面的设计。§ 本文所作工作绪论部分对数据库应用系统的结构、开发进行了简要介绍,分析了图书管理信息系统设计的特点和任务。第二章介绍了数据库的设计和范式分析,并系统介绍了SQL语言,为设计和理解应用程序做了铺垫。第三章对系统介绍了Delphi 的数据库编程技术、SQL语言在Delphi 中的应用、MS SQL Server基础。第四章分析了图书管理系统的应用需求,设计了系统的数据库结构,并根据需求对系统功能进行了划分和细化。第五章根据第四章的设计结果利用MSSQL Server2000和Delphi 进行了具体的应用程序设计。总结部分介绍了设计体会和编程体会,并指出了系统设计中的不足和改进的方向。第二章 数据库理论基础一个成功的信息管理系统,是建立在许多条件之上的,而数据库是其中一个非常重要的条件和关键技术。信息管理系统所涉及的数据库设计分五个步骤:数据库需求分析、概念设计、逻辑设计、物理设计与加载测试。SQL为许多任务提供了命令,其中包括:n 查询数据n 在表中插入、修改和删除记录n 建立、修改和删除数据对象n 控制对数据和数据对象的存取n 保证数据库一致性和完整性以前的数据库管理系统为上述各类操作提供单独的语言,而SQL 将全部任务统一在一种语言中。所有关系数据库的公共语言:由于所有主要的关系数据库管理系统都支持SQL语言,用户可将使用SQL的技能从一个RDBMS(关系数据库管理系统)转到另一个,所有用SQL编写的程序都是可以移植的。 SQL语句SQL功能强大,是一种完备的数据处理语言,不仅用于数据库查询,而且用于数据库中的数据修改和更新,概括起来,它可以分成以下几组:DML(Data Manipulation Language,数据操作语言):用于检索或者修改数据;DDL(Data Definition Language,数据定义语言): 用于定义数据的结构,比如 创建、修改或者删除数据库对象;DCL(Data Control Language,数据控制语言):用于定义数据库用户的权限。DML组可以细分为以下的几个语句:SELECT:用于检索数据;INSERT:用于增加数据到数据库;UPDATE:用于从数据库中修改现存的数据;DELETE:用于从数据库中删除数据。DDL语句可以用于创建用户和重建数据库对象。下面是DDL命令:CREATE TABLE,ALTER TABLE,DROP TABLE,CREATE INDEX,DROP INDEX下面是一个简单SQL语句的例子:我们使用SQL语句来从Book中检索‘借书证号’为‘000001’的借阅者姓名:SELECT 姓名 FROM Book WHERE 借书证号 = ‘000001’ DDL与DML数据定义语言DDL:它是用来创建和修改数据库结构的一种语句,包括 Create、Alter和Drop 语句。数据操作语言DML:包括数据查询与数据更新。数据查询主要是由Select语句完成,这一点不再赘述。而数据更新所造成的风险大大超过数据查询。数据库管理系统必须在更改期内保护所存储的数据的一致性,确保有效的数据进入数据库,数据库必须保持一致性,DBMS还必须协调多用户的并行更新,以确保用户和它们的更改不至于影响其它用户的作业。用于修改数据库内容的 SQL 语句主要有以下三个:(1) Insert,向一个表中加入新的数据行(2) Delete,从一个表中删除数据行(3) Update,更改数据库中已经存在的数据Insert标准语法:INSERT INTO table_name (col1, col2...) VALUES(value1, value2...)下例要将借书证号为‘000001’作为一个新的借书情况加入借书情况表OWNER中Insert Intoowner (借书证号,图书编号,借书日期)values (‘000001’,‘00000001’,‘2002-9-12’)Insert 语句还可以将多行数据添加到目标表中去,在这种形式的 Insert 语句中,新行的数据值不是在语句正文中明确地指定的,而是语句中指定的一个数据库查询。添加的值来自数据库自身的行,在某些特定的状态下,这是非常有用的。多行 Insert 语句为拷贝数据提供了一种紧凑而高效的方法,但我在自已做的图书管理系统中没有使用这种方法,我在系统中是使用循环依照上面的用法来完成多个记录的插入。Update语句用于更新单表中选定行的一列或多列的值。要更新的目标表在语句中定义,Set子句则指定要更新哪些列并计算它们的值。Update语句总是包含Where语句,而且Update语句比较危险,所以您必须明确地认识到Where语句的重要性,Where语句被用来指定需要更新的行。标准语法:UPDATE table_nameSET columnname1 = value1[, columname2 = value2]...WHERE search_conditionDelete 语句标准语法:DELETE FROM tablename WHERE 复杂操作实现在信息管理系统中,我们往往会遇到归类、汇总、映射、索引、子查询等复杂操作,相应的支持与实现如下:u GROUP BY方法GROUP BY子句语法为:SELECT column1, SUM(column2)FROM "list-of-tables"GROUP BY "column-list";这个GROUP BY子句将集中所有的行在一起,它包含了指定列的数据以及允许合计函数来计算一个或者多个列。在本人的系统中在显示数据时用到了此语句来对查询所得的内容排序然后再显示。u 组合条件和布尔运算符以下的SQL语句中就含有组合条件:SELECT column1, SUM(column2)FROM "list-of-tables"WHERE "condition1" AND "condition2";下面是一个示例:SELECT 身份描述FROM ID,userWHERE ID.身份编号=USER.身份编号 and user.借书证号=’000001’;这条SQL语句是从user、id表中查找借阅证号为000001的借阅者的身份描述,第三条语句中如果其中有一个条件为假,那么就什么都没有显示。u UNION子句有些时候,需要一起浏览多个查询的结果、组合它们的输出,我们可以使用UNION关键字。第三章 应用系统开发工具§ VCL组件的体系结构非可视组件是与可视组件相并列的另一类组件,非可视组件在程序运行中是不可见的(除各种对话框组件之外,事实上有人认为对话框组件不能归入非可视组件,应该是另一种介于可视与非可视之间的组件)。最后要说明一下,常说的控件实际上是一种组件。也就是说组件这个概念要大于控件,控件在内涵上包含于组件中。控件由Windows系列操作系统提出并使用,而组件是Borland和其它厂商在对Windows控件做了必要的扩展之后提出来的概念,它们是在不同时期由不同的厂商提出的概念。§ 数据库组件介绍§ SQL语言在Delphi中的应用。为参数赋值有三种方法:①根据参数在SQL语句中出现的顺序,设置TADOQuery组件的parameters属性值为参数赋值。②直接根据SQL语句中各参数的名字,调用ParamByName方法来为各参数赋值。③将TADOQuery组件的DataSource属性设置为另一个数据源,这样将另一个数据源中与当前TADOQuery组件的SQL语句中的参数名相匹配的字段值赋给其对应的参数。利用这种方法也能实现所谓的连接查询,创建主要—明细型数据库应用。在使用动态SQL语句编程时,常常用到一个很重要的方法Prepare,调用Prepare 方法之后,Delphi会将带参数的SQL语句传送给与其对应的数据库引擎,对动态SQL语句进行语法分析和优化。虽然在用动态SQL语句编程时,调用Prepare方法并不是必须的,但是调用Prepare方法后,会极大地提高动态SQL 语句的执行性能,特别是当要反复多次执行同一条动态SQL语句时,其优越性会更加明显。 如果在应用程序中执行一条SQL语句之前并没有显式地调用Prepare方法,每次在执行SQL 语句时,Delphi会隐含地调用Prepare方法以准备这个查询。TadoQuery部件还有一个Prepare属性,这是一个布尔型属性,当其属性值为True时, 表明该查询已被准备好了( SQL 语句已被传送到数据库引擎中 ) , 当我们使用参数编辑器Parameters Editor来为动态SQL语句中的参数赋值时,当设置完相应的参数值并退出参数编辑器时,Delphi会隐含地调用Prepare方法以准备好查询。当SQL语句执行完之后,要想准备下一个查询,首先必须调用Close方法,然后才能调用Prepare方法准备下一个查询。一般来说,在一个应用程序中应该调用一次Prepare方法,常常在窗体的OnCreate事件处理过程中调用Prepare方法, 然后用上述介绍的方法为参数赋值,最后调用Open方法或ExecSQL方法执行SQL语句,以完成查询。当然在调用Prepare方法准备好一个查询时,会消耗一些数据库资源, 因而每当一个查询执行完毕之后,要养成调用UnPrepare方法以撤消查询的好习惯。在运行程序过程中,通过程序改变TQuery或TADOquery部件的SQL属性值时,Delphi会自动地调用Close方法和UnPrepare 方法,以撤消查询。在程序运行过程中,要想设置Tquery或TADOquery部件的SQL属性,必须首先调用Close方法,关闭TQuery或TADOquery部件,然后再调用Clear方法清除SQL属性中现存的SQL命令语句, 最后再调用Add方法为SQL属性设置新的SQL命令语句。例如:;;('SELECT 借书证号,密码 FROM [user] WHERE (借书证号 = :tt)');[0].value:=username;;在为TQuery或TADOquery部件设置SQL属性时调用Close方法总是很安全的,如果TQuery或TADOquery部件已经被关闭了,调用Close方法时不会产生任何影响。在应用程序中为SQL属性设置新的SQL 命令语句时,必须要调用Clear方法以清除SQL属性中现存的SQL命令语句,如果不调用Clear方法,便调用Add方法向SQL属性中设置SQL命令语句,那么新设置的SQL命令语句会追加在现存SQL命令语句后面, 在程序运行时常常会出现出乎意料的查询结果甚至程序无法运行下去。在这里要特别注意的,一般情况下TQuery或TADOquery部件的SQL属性只能包含一条完整的SQL语句,它不允许被设置成多条SQL语句。当然有些数据库服务器也支持在TQuery或TADOquery部件的SQL属性中设置多条SQL语句,只要数据库服务器允许这样,我们在编程时可以为 SQL 属性设置多条SQL语句。在为TQuery或TADOquery部件设置完SQL属性的属性值之后,也即编写好适当的SQL程序之后,可以有多种方式来执行SQL程序。在设计过程中,设置完TQuery或TADOquery部件的SQL属性之后将其Active属性的值置为True, 这样便可以执行SQL属性中的SQL程序,如果应用中有与TQuery或TADOquery部件相连的数据浏览部件( 如TDDGrid TDBEdit等)那么在这些数据浏览部件中会显示SQL程序的执行结果。在应用程序运行过程中,通过程序调用TQuery或TADOquery组件的Open方法或ExecSQL 方法可以执行其SQL属性中的SQL程序。Open方法和ExecSQL方法是不一样的。Open方法只能用来执行SQL语言的查询语句(Select命令), 并返回一个查询结果集,而ExecSQL方法还可以用来执行其它常用的SQL语句(如INSERT, UPDATE, DELETE等命令),例如: (这样会返回一个查询结果集)如果调用Open方法,而没有查询结果时,会出错。此时应该调用ExecSQL 方法来代替Open方法。如: (没有返回结果)当然在设计应用程序时,程序设计人员是无法确定TQuery或TADOquery组件中的SQL 语句是否会返回一个查询结果的。对于这种情况应当用Try…Except模块来设计程序。在 Try 部分调用Open方法,而在Except部分调用ExceSQL方法,这样才能保证程序的正确运行。例如:通过Tquery或TADOquery组件可以获得两种类型的数据:u “活动”的数据这种数据就跟通过TTable部件获得的数据一样,用户可以通过数据浏览部件来编辑修改这些数据,并且当调用Post方法或当焦点离开当前的数据浏览部件时,用户对数据的修改自动地被写回到数据库中。u 非活动的数据(只读数据)用户通过数据浏览部件是不能修改其中的数据。在缺省情况下,通过TQuery部件获得的查询结果数据是只读数据,要想获得“活动”的数据,在应用程序中必须要设置Tquery或TADOquery组件的RequestLive属性值为True,然而并不是在任何情况下(通过设置RequestLive的属值True)都可以获得“活动”的数据的,要想获得“活动”的数据,除了将TQuery部件的RequestLive属性设置为True外,相应的SQL命令还要满足以下条件。本地SQL语句查询情况下,要得到可更新的数据集,SQL语句的限制为:n 查询只能涉及到一个单独的表n SQL语句中不能包含ORDER BY命令n SQL语句中不能含聚集运算符SUM或AVGn 在Select后的字段列表中不能有计算字段n 在Select语句WHERE部分只能包含字段值与常量的比较运算,这些比较运算符是:Like, >, <, >=, <=。各比较运算之间可以有并和交运算:AND和OR当通过SQL语句查询数据库服务器中的数据库表:n 查询只能涉及到一个单独的表n SQL语句中不能包含ORDER BY命令n SQL语句中不能含聚集运算符SUM或AVG运算另外,如果是查询Sybase数据库中的表,那么被查询的表中只能有一个索引。如果在应用程序中要求TQuery或TADOquery组件返回一个“活动”的查询结果数据集,但是SQL 命令语句不满足上述约束条件时,对于本地数据库的SQL查询,BDE只能返回只读的数据集。对于数据库服务器中的SQL查询,只能返回错误的代码。当Tquery或TADOquery组件返回一个“活动”的查询结果数据集时,它的CanModIfy属性的值会被设置成True。§ MS SQL Server简述 关系数据库的逻辑设计§ 数据模块窗体的设置
去图书馆之家搜搜看 貌似有个WORD版本的系统介绍然后去CNKI上搜一下吧
195 浏览 5 回答
134 浏览 3 回答
195 浏览 6 回答
238 浏览 7 回答
304 浏览 8 回答
191 浏览 6 回答
180 浏览 9 回答
115 浏览 9 回答
339 浏览 8 回答
250 浏览 8 回答
229 浏览 3 回答
113 浏览 4 回答
179 浏览 7 回答
117 浏览 6 回答
122 浏览 3 回答