Delphi通过ADO读写数据库
<p> ADO是一种程序对象,用于表示用户数据库中的数据结构和所包含的数据。</p><p>ADO (ActiveX Data Objects,ActiveX数据对象)是Microsoft提出的应用程序接口(API)用以实现访问关系或非关系数据库中的数据。例如,如果您希望编写应用程序从DB2或Oracle数据库中向网页提供数据,可以将ADO程序包括在作为活动服务器页(ASP)的HTML文件中。当用户从网站请求网页时,返回的网页也包括了数据中的相应数据,这些是由于使用了ADO代码的结果。</p>
<p> 在Delphi 5.0 以上的版本都可以很好的支持ADO技术。</p>
<p><img src="https://img2018.cnblogs.com/blog/1107379/201908/1107379-20190801090207396-488745512.png" alt=""></p>
<p> Delphi 中 ADO 主要有</p>
<p>1、ADOConnection 用于链接数据库</p>
<p>2、ADOCommand ADODataSet 用来查询或执行SQL语名;</p>
<p>3、DataSource 数据中间存储组件;</p>
<p>4、DBGrid 数据显示出来;</p>
<p><strong>其实主要是用ADO连接,而ADO也是最常用的连接技术之一。<br></strong><br> 以下几个控件在连接数据库时是用得比较多的,并且通常的的连接架构是<br><br>————————————————————<br> 数据库<br> ↑<br> ADOConnection<br> ↑ ↑<br>ADOCommand ADODataSet<br> ↑<br> DataSource<br> ↑<br> DBGrid<br>————————————————————<br><br>或者<br><br>————————————————————<br> 数 据 库<br> ↑ ↑<br> ADOCommand ADODataSet<br> ↑<br> DataSource<br> ↑<br> DBGrid<br>————————————————————<br><br>也就是说,ADOCommand和ADODataSet既可以通过ADOConnection连接数据库,也可以不用,分别直接连接数据库,因为这三个控件都有一个共同的ConnectionString属性。</p>
<p><strong>一、 TADOConnection组件<br></strong>该组件用于建立数据库的连接。ADO的数据源组件和命令组件可以通过该组件运行命令及数据库中提取数据等。<br>该组件用于建立数据库的连接,该连接可被多个数据集所共享,但是并不是应用程序中必须的,因为ADO数据集及命令组件通过设置其ConnectionString属性,可以直接连接到数据库。但是如果多个数据集使用相同的数据库连接时,则使用TADOConnection就有一定的优势,因为不必为每个数据集都单独建立数据库的连接,同时也减少了资源的消耗,并且可以建立跨越多个数据集的事务。一个事务(transaction)是数据库操作的一个阶段,用户对数据库的修改都保存在本地计算机的内存中,只有提交一个事务后,才能将修改的内容提交到数据库中。如果选择了回滚事务,则所有的修改将被取消,而不会提交到数据库中。<br><br>? TADOConnection组件提供如下功能:<br>v 控件数据库的连接<br>v 控制服务器的注册<br>v 管理事务<br>v 为关联的数据集提供数据库连接<br>v 将SQL命令发送到数据库中<br>v 获得数据库的原数据(metadata)<br><br> <strong>TADOConnection的常用属性</strong></p>
<p><br>1) Attributes<br> 此属性用于设置连接的数据库的自动处理的行为,它是TxactAttributes<br>类型的集合,包括两个集合元素:<br>I. XaCommitRetaining:提交一个事务后自动开始一个新的事务。<br>II. XaAbortRetaining: 回退一个事务的同时将开始一个新的事务。<br>2) CommandTimeout<br> 连接超时属性,用于设置一个命令执行时所能等待的最大时间值。以秒为计量单位。缺省值为30秒,即连接命令等待了30秒之后还没有被执行,系统就放弃这个命令。<br>3) Connected<br> 标识和数据库的连接是否处于激活状态。<br>用户可以查询Connected属性的值来判断数据库的连接状态。如果该属性为true,则表明数据库处于连接状态;为false,则当前数据库连接关闭。<br>4) ConnectionString<br> 连字符串用于指定数据库的连接信息。连字符串的标准调用方为:ADOConnection1.ConnectionString:='Provider=ProviderRet;Remote Server=ServerRet';<br>其中,连接串支持的常用参数如下:<br>数据库连接参数及说明<br> 参数 说明<br>Provider 数据提供者名称,例如MSDASQL.1<br>Password 登录数据库的口令<br> 参数 说明<br>Persist Security 支持安全登录<br>User ID 登录数据库用户<br> DataSource 数据源名称、数据源的设置需要额外的操作<br>设置成功之后,用户就可以将属性Connected设置为True,如果没有任何提示信息,说明数据库已经成功连接,此时,属性DefaultPatabase就被赋值为连接所指定的数据库的路径。<br> 5) ConnectOptions<br> 指定数据库连接是按照同步方式还是异步方式。类型Tconnectoption包含两个值:<br>v coConnectUnspecified:数据库连接采用同步方式连接。<br>v coAsyncConnect:异步方式连接数据库。当服务器负载很重的时候,这种连接方式很有用。引用这种连接方式,在第一次建立连接的时候,应用程序不能获得全部的数据。<br> 6) CursorLocation<br> 指定数据库指针是指向客户端还是服务器端。类型TcursorLocation包含两个值:<br>v cluseServer:使用服务器端的数据库指针,适用于数据量大的数据集。<br>v cluseClient:使用客户端的数据指针的时候,数据将被下载到本地计算机上,并在本地进行操作。<br>7) DefaultDatabase<br> 表明数据源成功连接后,这是由数据源自动赋值的。<br>8) IsoLationLevel<br>指定不同事务之间的相互独立的级别,事务实际上是对数据库的一系列操作的集合。事务具有整体性,如果事务中的某一个步骤不能正确执行,则整个事务都不会执行。由于数据库服务器可以同时支持多个连接,来自不同连接的事务有可能在同一时刻对同一个数据进行操作,这就有可能造成数据不一致性。为防止这种情况出现,ADO引入了事务独立级来确定不同事务之间的相互关系。设定事务独立级之后并调用BeginTrans方法后,新的事务独立级别将生效。<br>TISolationLevel共包含9种常量值:如下:<br>TISolationLevel常量及说明<br>常量参数 说明<br>ilUnspecified 使用默认的独立级别,没有其它的独立级别<br>ilChaos 来自更高独立级别的事务对数据的改变不能被当前的事务覆盖<br>ilReadUncommitled 当前事务可以读取其他事务未提交的数据<br>ilBrowse 当前事务可以读取其他事务未提交的数据<br>ilcursorStability 事务提交后数据才能被读取<br>ilReadCommitled 事务提交后数据才能被读取<br>ilRepeatableRead 不能读取其它事务的数据,执行Requery操作可以获得这些数据<br>ilSerializable 从其他事务中获取事务的独立级别<br>ilIsolated 从其他事务中获取事务的独立级别</p>
<p> 这些常量的定义在Microsoft Data Access SDK中有详尽的说明,需要进一步了解可以查询微软的SDK文档。<br>9) KeepConnection<br> 指定如果在没有打开数据集的情况下是否仍然保持数据的连接。<br> 濒繁地打开和关闭数据库的操作将会影响系统的性能,特别在网络上,会在一定程度上增加网络的负载。这个属性设置数据源始终处于连接状态,可以显著提高程序的性能。<br>10) LoginPrompt<br> 指定在每次建立连接时是否弹出登录对话框提示用户登录。如果设为False,则必须在ConnectionString中指定登录数据库的用户和密码。<br>11) Mode<br> 指定连接对数据库的操作权限,这种连接模式的值如下:<br>连接模式参数及说明<br>参数 说明<br>cmUnknown 未指定数据库操作权限或无法确定<br>cmRead 对数据库只能读操作<br>cmWrite 对数据库只能写操作<br>cmReadWrite 对数据库可读写操作<br>cmShareDenyRead 禁止其他用户对数据库读操作<br>cmShareDenyWrite 禁止其他用户对数据库写操作<br>cmShareExclusive 禁止其他用户对打开数据连接<br>cmShareDengNone 禁止其他用户对数据库任何操作<br><br> ADOConnection的主要方法:<br>1) BeginTrans<br> 开始启动一个新的事务,必须保证数据连接处于激活状态。<br>2) Cancel<br> 关闭于数据库的连接。<br>3) CommitTrans<br> 向数据库提交一个事务。提交成功后,再事务中对数据库所作的修改则写入数据库中,同时一个事务也结束。<br>4) Execute(constCommandText:Widestring;VarRecordsAffected;Executeoptions:TexcuteOptions=);<br>执行一个CommandText类型的SQL命令,其中,CommandText是指定的SQL命令;ReardsAffected指定该命令设计的记录数目;ExecuteOptions指定命令特征如下:<br>ExecuteOption的值及说明<br>参数 说明<br>eoAsyncExecute 异步执行命令<br>eoAsyncFetch 给定了Cache属性的值后,在异步地去数据<br>eoAsyncFetchNonBlocking 非阻塞式线程执行<br>eoExecuteNoRecords 没有返回记录<br>5) GetProcedureNames(List:Tstring);<br> 获取数据库服务器上的存储过程名称,获取的存储过程名称在List参数中。<br>6) GetTableNames(List:Tstring;SystemTables:Boolean=False);<br> 获取数据库中的数据表,获取的表名存放在List参数中SystemTables参数指示是否获取数据库系统表的名称。数据库系统表是指在数据库中关于数据库数据类型定义和用户信息的数据表,这种系统表是数据库本身自动生成的。<br>7) Open(const UserID:widestring;constPassword:widestring) <br> 打开一个连接,参数UserID是数据库用户的用户名。Password是用户登录数据库的密码。<br>8) RollbackTrams<br> 撤回一个没有全部执行的事务。事务撤回之后,事务中所作的任何修改都不会写入数据库。<br><br> <strong>ADOConnection的主要事件<br></strong>事件 说明<br>AfterConnect 发生在一个连接建立之后<br>AfterDisconnect 发生在断开连接之后<br>BeforeConnect 发生在连接建立前<br>BeforeDisconnect 发生在断开连接前<br>OnBeginTranscomplete 发生在开始一个事务时<br>OnCommitTranscomplete 发生在提交事务成功时<br>OnConnectComplete 发生在连接完成时<br>OnDisconnect 发生在断开时<br>OnExecuteComplete 发生在一个命令执行后<br>OnInfoMessage 发生在收到数据库的消息<br>OnLogin 发生在用户登录数据库的时候<br>OnRollbackTransComplite 发生在一个事务撤回之后<br>OnWillConnect 发生在发出一个连接数据请求的时候<br>OnWillExecute 发生在数据库收到一个SQL命令并将要执行之前</p>
<p> </p>
<p><strong>二、ADOCommand组件</strong></p>
<p><br> ADOCommand向数据库发送SQL指令并返回请求的数据集。<br>ADOCommand组件主要用于运行一些数据定义语言(DDL)的SQL命令或者运行一个没有返回结果的存储过程。对于返回结果集的SQL语句,则最好使用TADODataset、TADOQuer或TADOStoredProc组件。尽管ADOCommand组件的Exexute方法可以返回一个结果集,但却是通过另一个ADO数据集组件来使用该记录集。<br>TADOCommand组件与ADOCommand对象相似,所以ADOCommand组件中的属性和方法在ADOCommand对象中都能找到相同的饿名字,并且具有相同的作用。如果使用ASP开发过动态网页,对此一定会有深刻的认识。<br> TADOCommand代表了ADOCommand(ADO命令)对象,它通过一个ADO提供者访问数据库。TADOCommand组件执行的是其CommandText属性中设置的命令,通过调用Execute方法执行该命令。如果该命令中需要使用参数,则通过Parameters属性设置,该属性与BDE数据集Tquery组件的Params属性的作用及设置方法相同。<br><br>? ADOCommand的主要属性<br>1) CommandText<br> 指定要执行的SQL命令,可以手工编写,也可以利用CommandText编辑器对话框来设置这个属性。<br>CommandText编辑器是专门用来为ADO组件来编写SQL命令的。Table列表框用来列出数据库中所有的表,选中一个表,单击”Add Table to SQL”按钮,CommandText编辑器就会自动把表名插入SQL命令的相应位置。在选中某个表的同时,这个表中的所有字段都会自动地列在Fields列表框里。同样,选中Fields列表框中的一个字段,单击”Add Fields to SQL”,字段就会插入到SQL命令中。<br>2) CommandType<br> 指定要执行的命令的种类:<br>CommandType的参数及说明<br>参数 说明<br>cmdUnknown 未知的命令类型<br>cmdText 文本类型<br>cmdTable 命令中指定的是一个表的名称<br>cmdStoredProc 命令中指定的是一个存储过程的名称<br>cmdFile 命令中指定的是保存数据集的文件名<br>cmdTableDirect 命令中指定的是表的名称,并返回所有的列<br>3) Connection<br> 指定所使用的数据源连接组件的名称,即ADOConnection组件的名称,通过这个属性使得ADOCommand能与数据库连接起来。<br>4) Paramcheck<br> 指定在SQL命令动态改变的时候,是否需要重置参数列表。<br>5) Parameters<br>执行SQL命令时要用到的参数,在参数查询中,即在SQL命令中或在存储过程中需要传递参数的时候才需要设置这个值,并且在命令类型CmmandType指定为cmdText或cmdStoredProc时,参数才有效。<br><br>? ADOCommand主要方法:<br>1) Cancel<br> 中止一个正在执行的命令<br>2) Assign(source:TPersistent)<br> 把另一个ADOCommand组件的所有属性复制到当前的ADOCommand组件中。调用的时候,按名存取组件对象。<br>3) Execute<br> 执行ADOCommand组件所包含的命令,返回结果是一个数据记录集,可以被其他ADO组件的Recordset记录集属性调用。</p>
<p> </p>
<p><strong>三、 ADODataset组件</strong></p>
<p><br> ADODataset是ADO组件中最通用的一个组件,它能获取并代表任何其他ADO组件从数据库返回的数据集合。数据集是通过SQL命令返回的一个表或者多个表数据。<br> 要使ADODataset数据集组件能够正常地发挥作用,则应首先设置其Connection或Connection String属性来建立起到数据库的连接。如果要使用一个RDSDataSpace对象将该数据集连接到基于ADO的应用程序服务器,则需要RDSConnection属性设置为一个TRDSConnection对象。<br>由于ADODataset组件必须返回一个结果集,所以其CommandText属性中如果使用语句,则只能使用SELECT语句,而不能使用一引起数据操作语言(DML),比如DELETE、INSERT和UPDATE语句。<br>同时由于该数据集可以使用SQL 语句。所以可以从一个或多个基表中查询数据。<br><br>? ADODataset的常用属性<br>1) Active<br> 指示当前的记录集是否处于打开状态,调用open方法,打开数据库,Active值为True;调用close方法,数据库关闭,则Active为False;<br> 只有Active的值为False时,应用程序才能对数据库进行读写操作。需要将Active变为True的情况是:<br>v 数据库的状态设为dsBrowse(浏览模式、查看、扫描数据)。<br>v 如果程序中加载了BeforeOpen事件,在该事件被触发时。<br>v 如果程序加载了AfterOpen事件,在该事件被触发时。<br>v 通过记录集打开一个数据指针时。<br> 在更改数据集属性,且这些属性影响到数据库的状态或数据显示组件的状态时,要提前将数据集的Active属性设置为False;<br>2) AutoCalcFields<br> 设为True,则允许应用程序触发OnCalcFileds事件。计算字段依赖于当前记录的一个或多个字段。通过已有的字段数据统计计算。该值为True,在记录数据被修改或者编辑时,就触发OnCalcFields事件。应用程序自动更新计算字段的值,以保证数据的一致性 。能触发OnCalcFileds事件的条件是:<br>v 数据集组件的状态变为dsEdit。<br>v 记录已经被修改。<br>v 应用程序从数据库中重新获得一条记录。<br> 可以看出,上述的情况并不都需要更新计算字段。如果用户需要频繁地修改数据,则OnCalcFields事件就会不断地调用。频繁地调用在一定程度影响了应用程序的性能。在这种情况下,可以将属性AutoCalcFields设为False。<br>3) Cachesize<br> 指定数据集的缓冲区大小。数据集首先把数据从数据库中取出,然后保存在内存的一块域中。这块内存区域就是所谓的缓冲区。如果设置CacheSize为20,则表示数据集将一次从数据集将一次从数据库中提取20条记录并将这20条记录保存到缓冲区中。缺省值为1,也是最小值。</p>
<p><br><strong>4) CommandText</strong></p>
<p><br> 指定数据集合中包含的命令,可以是SQL语句,一个表名或者一个存储过程名。常用的调用形式为:<br>with ADODataset1 do <br>begin<br> commandType:=cmdText;<br>command Text:=’Select * From customerTable’;<br>open;<br>end;<br><br><strong>5) Filer</strong></p>
<p><br> 数据集的过滤器,通过使用过滤器可以把那些不需要的数据过滤掉。设置Filter属性的典型方法为:<br>with ADODataset1 do begin<br>Filterd:=False;<br>Filter:=’State=’+Quotedstr(‘CA’)+’OR’+”State=’+Quotedstr(‘CA’);<br>Filterd:=True;<br>End;<br> 如果用户修改了带有过滤数据集的数据,修改的结果如果不满足过滤器的条件,则修改的数据就自动从当前的数据库中消失。</p>
<p><strong>6) MaxRecord</strong></p>
<p><br> 最大 返回数据集记录数,默认值为0 返回所有数据。</p>
<p><strong>7) RecordCount<br></strong><br><br>显示与数据集相连的记录的总数</p>
<p> </p>
<p><strong>详细的属性大家可以看最后一页 <br><br><br> ADODataset的常用方法</strong></p>
<p><br><strong>1) GetIndexNames(List:Tstring)</strong></p>
<p><br> 查询表中的全部索引,返回值将保存在参数List中,调用方法为:<br>ADODataset1.GetIndexNames(ListBox1.Items);</p>
<p><br><strong>2) DeleteRecords(AffectRecords:TaffectRecords=arAll)</strong></p>
<p><br> 删除记录集的记录,参数AffectRecords用于指定要删除的具体记录。它的取值可为如下:<br>AffectRecords的参数及说明<br>参数值 说明<br>arCurrent 仅删除当前记录<br>arFiltered 删除满足过滤器过滤条件的数据<br>arAll 删除记录的所有记录<br>arAllChapters 删除ADO连接数据部分的全部记录<br> 缺省值为arAll,删除当前记录集中的所有记录。</p>
<p><strong>3) Locate(const KeyFields:String;constKeyValues:Variant;Options:TLocateOptions)</strong></p>
<p><br> 定位一条记录并把这条记录作为当前记录。其中KeyFields是索引的字段名;KeyValues是要查找的值;Options是定位数据选项,他的值可以是:<br>v IoCaseInsensitive:定位数据不区分大小写。<br>v IoPartialkey:部分匹配定位查找数据。</p>
<p><br><strong>4) Requery(options:TexecuteOption=[])</strong></p>
<p><br> 刷新数据集中的数据,它是通过重新执行原来的命令或SQL语句来重新生成记录集。</p>
<p><br><strong>5) SaveToFile(constFileName:String=’’;Format:TpersisFormat=PftAdTg)<br></strong></p>
<p> 把当前数据集中的数据按照指定的格式保存到指定的文件中。FileName为指定的文件名:Format为保存的文件格式,它可以选取下列值:<br>v PfAdTG:按照ADTG(Advanced Data Tablegram)格式生成文件。<br>v PfXML:按照XML格式保存文件。</p>
<p><br><strong>6) seek(constKeyValues:Variant;seekOption:Tseekoption=SoFirstEQ)<br></strong> 搜索记录并移动数据集的指针。搜索动作是以当前数据集中的索引为搜索依据。其中KeyValues为被搜索的值。<br> Success:=ADODataSet1.seek(‘Jones’,SoFirstEQ);<br> 如果搜索到复合索引的值,则返回True,反之为False,也可以同时搜索多个值:<br> ADODataSet1.seek(VarArrayof(),soFirstEQ);<br> 这就需要利用函数VarArrayof()构造一个参数传递给KeyValues。<br> Seek的第二个参数seekoption限定了搜索行为的动作。</p>
<p>可以取的值如下:</p>
<p><br>Seekoption的取值及说明<br>参数值 说明<br>SoFirstEQ Rexord 数据库指针定位在第一条匹配的记录处,如果没有任何匹配记录则指向数据库的未记录<br>SoLastEQ Record 数据库指针定位在最后一条匹配的记录处,如果没有任何匹配记录则指向数据库的未记录<br>SoAfterEQ Record 如果搜索到匹配记录,在指向匹配记录的下一条,如果没有找到则指向最近似匹配记录上<br>SoAfter 指向匹配记录的下一条<br>SoBeforeEQ 如果搜索到匹配记录,在指向匹配记录的前一条,如果没有找到则指向最近似匹配记录上<br>SoBefore 指向匹配记录的前一条</p>
<p> </p>
<p><strong>四、ADOTable组件</strong></p>
<p><br> ADODataset组件、ADOTable组件、 ADOQuery组件和ADOstreProc组件都是继承自父类TcustomADODataset ,所以在属性、事件及方法上有许多共同的地方。<br> TADOTable组件只能通过ADO访问数据库中单个基表的数据,它即可以访问 一个基表中的所有数据及字段,也可以访问部分记录,即通过在Filter属性设置筛选条件实现。<br>由于TADOTable组件与其他组件不同的是,它专门针对数据库中表进行操作。<br><br>? TADOTable特有的一些属性方法:<br>1) MaterSource属性和MasterFields属性<br> MaterSource属性是用于建立主从关系的数据源,当前的ADQTable中的数据将根据MaterSource属性所指定的数据源变化而变化。在一个数据库汇总,某些表之间可能存在互相关联的,一种常见的情况是两个表之间存在共同的字段。通过这些共同的字段,可以建立主从关系的关联。可以通过访问一个表而得到另一个表的数据,这种主从关系建立以后,如果用户在主表记录选中一条记录,则从表中相应的记录自动获得。<br> MasterFields属性指定用于建立主从关系的关联字段,指定的字段是将主表和从表赖以存在的纽带,这个字段必须是主从表中共有的字段。<br>2) Readonly<br> 指定ADOTable中数据是否处于只读状态。<br>3) TableDirect<br> 指定是通过表名来访问数据库还是在后台运行SQL命令访问数据库,部分的数据提供者不支持通过表名对数据库的访问,这时的ADOTable就只能通过后台运行SQL的SELECT语句来访问数据库。如果设置为True,则ADOTable组件在后台运行SQL命令访问数据表,为False按表名访问数据库,缺省值为Flase。<br>4) TableName<br> 指定ADOTable要操作的表名。<br> 只有当设置了正确的connection或者connectionstring,Active属性为True的时候,才能设置TableName属性,表名的列表才会在ObjectInspector中显示。<br>5) Append方法和AppendRecord(constValues:arrayofconst)<br> 使用Append方法在增加一条新记录的同时,并为新记录赋值。赋值是通过一个数组作为参数传递进去的。但是必须保证数组的维数和字段数一致且顺序一致。<br>6) Post方法<br> 执行Post方法,是将已经修改完毕的记录写入数据库中。通常是每执行完一个修改记录的操作,执行一次Post操作,以完成对数据库的更新。</p>
<p> </p>
<p><strong>五、ADOQuery组件</strong></p>
<p><strong><br></strong> ADOQuery组件借助于SQL语言的强大功能访问多个数据表,可以实现数据浏览、修改和删除等操作,并且,ADOQuery组件可以实现参数查询。所谓参数在使用上可以理解为变量。在执行SQL之前,就被赋值。运用参数化查询,不需要修改SQL语句,给定不同的参数值,就可以获得不同得到的查询结果。通常情况下,使用ADOQuery是为了从数据集中查询一部分字段或记录,也可以使用INSERTV、DELETE、UPDATE、ALTER TABLE等SQL命令实现数据的更新、插入和删除记录的操作。如果数据集只包含一个基表,则可以使用ADOQuery,也可以使用TADOTable数据集。<br><br>? ADOQuery的主要属性和方法<br>1) SQL属性<br> SQL属性是Tstring类型的变量,包含了ADOQuery组件要执行的SQL命令,它是ADOQuery的最为重要的属性之一。在应用程序中,可以调用open方法或ExecSQL方法来执行SQL属性中指定的SQL语句。在代码编写阶段,可以利用属性编辑器编写,在应用程序执行过程中也可以动态的修改。<br>2) Parameters<br> Parameters属性中保存了SQL属性中的SQL命令中执行所需的参数 ,这些参数可以在程序设计阶段添加,这时可以在ObjectInspector设定参数的值,并且,参数的数量和类型必须与SQL属性中SQL语句的参数一致。<br>3) oepen方法和ExecSQL方法 <br> 这两种方法通常用于执行SQL属性所指定的SQL命令,动态上基本上类似。但是open方法通常调用SELECT语句,只要返回记录集,而ExecSQL方法执行Insertv、Update或Delete等命令,不返回记录集。无论是调用open方法还是ExecSQL方法,在执行它们之前都必须调用close方法。</p>
<p> </p>
<p> </p>
<p><strong>六、TADOStredProc组件</strong></p>
<p> </p>
<p><strong><br></strong> 如果一个客户应用程序必须使用数据库中的存储过程,则可以使用TADOstoreProc组件,一个存储过程是一组语句,提前建立好的保存在数据服务器上,可以反复被执行,在服务器上完成与数据库有关任务,并将结果传递给客户。<br><br>? TADOStoredProc组件的主要属性<br> TADOStoredProc组件与其它ADO数据集有相似的属性,经常需要设置的属性如下:<br>1) Active<br> 设置为True时,可以激活数据集;设置为False;则关闭数据集。<br>2) Connection<br> 如果应用程序中添加了TADOConnection组件,则可以通过选择该组件来建立数据库的连接。<br>3) Connectionstring<br> 如果设置Connection属性,则可以在该属性中设置一个连接到数据库的字符串。<br>4) DataSource<br> 是另一个数据集对应的数据源,用于为当前数据集提供一些值,一般情况下,不要设置该属性,更不能将其属性设置为当前数据集使用的数据源。实际上如果这样做,在设计阶段Delphi就会报错。<br>5) Filter<br> 设置筛选记录的条件。<br>6) Filtered<br> 决定是否激活Filter中设置的筛选条件。<br>7) Parameters<br> 设置数据集使用的存储过程的名字,可以从下拉框中选择。<br><br>? TADOStoredProc组件主要的方法<br>1) Create<br> 该方法用于建立TADOStoredProc组件的一个实例。实际上,当使用ADO组件面板上的TADOStoredProc组件,在一个表单或数据模块中插入该组件时,就自动建立了一个实例,也就相当于隐含地调用了Creat方法。所以一般很少直接调用该方法建立TADOStoredProc组件的实例。<br>2) close<br> 用于销毁TADOStoredProc组件的一个实例。<br>3) DeleteRecords<br> 用于删除一条或多条记录。<br>4) Edit <br> 设置数据集为编辑状态。<br>5) Enable Controls<br> 使用数据感知控件重新显示数据。<br>6) Disable Controls<br> 使数据感知控件不能显示数据。<br>7) Firse<br> 导航到数据集的第一条记录。<br>8) Last<br> 导航到数据集的最后一条记录。<br>9) Prior<br> 导航到数据集的前一条记录。<br>10) next<br> 导航到数据集的下一条记录。<br>11) MoveBy<br> 向前或向后导航多条记录。<br>12) GetFieldData<br> 将一个字段当前的值提取到缓冲区中。<br>13) IsEmpty<br> 判断一个数据集是否为空。<br>14) open<br> 打开一个数据集。<br>15) Refresh<br> 重新从数据库中提取数据来更新数据集的数据。<br><br>? TADOStoredProc组件的事件<br> TADOStoredProc组件与TADOQuery组件的事件基本相同,所以可以参考TADOQuery组件事件的说明。</p>
<p> </p>
<p><strong>七、TRDSConnection组件</strong></p>
<p><br> TRDSConnection组件 用于实现一个RDSData Space对象。当一个Recordset(记录集)对象从一个进程或机器传递到另一个进程或机器上时,RDSDataspace对象负责管理数据的汇集。当使用基于ADO的业务(business)对象(应用程序服务器)来建立多层的应用程序时,应该使用TRDSConnection对象。<br> 在建立应用程序时,使用TRDSConnection组件代替TADOConnection组件,建立与一个TADODataset数据集的关联关系,并在TADODataset组件的RDSConnection属性中选择使用的TRDSConnection组件实例。<br> 默认情况下,TRDSConnection组件与RDS DataFactory对象一起使用。如果不需要专门的业务对象,可以使用DataFactory对象。<br><br>? TRDSConnection组件主要的属性<br>1) Appserver<br> 用于访问应用程序服务器的通信接口,如果访问与Recordsets对象武官的业务对象的附加属性或方法时,可以使用该属性。<br>2) ComputerName<br> 指定一个业务对象的来源。如果该属性为空,则从本地计算机装载业务对象。HTTP、HTTPS和DCOM等协议,可以用于建立业务对象。如果使用HTTP和HTTPS协议建立业务对象,则Computername属性是包含确定ⅡS·web服务器的URL的一个字符串,服务器的业务对象实例就在该服务器上建立;如果使用DCOM协议,则computerName属性是计算机的名字。<br>3) DataSpaceObject<br> 提供对RDSDataspace对象接口的访问。<br>4) Connected<br> 确定是否已经建立了到远程数据源的连接,设置为True,则表示建立连接。<br>5) InternetTimeout<br> 设置超出规定的请求次数以前使用时间的数量,以毫秒计算<br>6) Name<br> 设置TRDSConnection组件实例的名字。<br>7) ServerName<br> 指定业务对象,即需要初始化的业务对象的ProgID。默认值是在RDSServer DataFactory属性中,这是RDSServer DataFactory对象的ProgID。<br><br>? TRDSConnection组件主要方法<br>1) GetRecordset<br> 用于从一个业务对象中提取一个记录集,与RDS连接组件关联的TADODataset会自动调用该方法,其方法如下:<br>function GetRecordest(Const CommandText:Widestring;connectionstring:widestring=’’):_recordset<br>2) Free<br> 销毁组件的实例并释放其占用的资源。<br>3) open<br> 打开TRDSConnection的连接。<br>4) Creat<br> 建立TRDSConnection组件的一个实例,当在表单或数据模块添加一个TRDSConnection组件时,就会隐含调用该方法。<br>5) Destory<br> 用于销毁TRDSConnection组件的一个实例,在应用程序中一般不要直接调用该方法。而应调用Free方法来销毁组件的实例<br><br><strong>TRDSConnection组件的事件<br></strong>1) AfterConnect<br> 该事件在建立TRDSConnection组件的连接后触发。<br>2) AfterDisConnect<br> 该事件在断开TRDSConnection组件的连接后触发。<br>3) ReforeConnect<br> 该事件在建立TRDSConnection组件的连接前触发。<br>4) BeforeConnect<br> 该事件在断开TRDSConnection组件的连接前触发。<br>5) OnLogin<br> 该事件在正确进行了用户注册并打开了到服务器的通道后触发。</p>
<p> </p>
<p> </p>
<p><br><br><strong>ADODataSet、ADOTable、ADOQuery属性通用属性</strong></p>
<p> </p>
<p>
</p>
<table style="width: 95%" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="3%">
<p> </p>
</td>
<td width="15%">
<p><strong>属 性</strong></p>
</td>
<td valign="top" width="80%">
<p><strong>说 明</strong></p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p>123</p>
</td>
<td valign="top" width="15%">
<p>Active</p>
<p> </p>
</td>
<td valign="top" width="80%">
<p>指明一个数据集是否处于打开状态</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p>123</p>
</td>
<td valign="top" width="15%">
<p>AutoCalcFields</p>
</td>
<td valign="top" width="80%">
<p>决定OnCalcFields事件何时被触发:当字段发生改变时计算自定义字段</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p> </p>
</td>
<td valign="top" width="15%">
<p>Bof</p>
<p> </p>
</td>
<td valign="top" width="80%">
<p>标志着记录指针是否停留在数据集的第一个记录上</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p>123</p>
</td>
<td valign="top" width="15%">
<p>CacheSize</p>
</td>
<td valign="top" width="80%">
<p>标识数据库缓存大小</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p> </p>
</td>
<td valign="top" width="15%">
<p>CacheUpdates</p>
</td>
<td valign="top" width="80%">
<p>表明一个数据集缓存的更新特性是否可用</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p> </p>
</td>
<td valign="top" width="15%">
<p>CanModify</p>
</td>
<td valign="top" width="80%">
<p>表明程序是否可以在表格里面插入﹑编辑﹑或删除数据</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p> </p>
</td>
<td valign="top" width="15%">
<p>CommandText1</p>
</td>
<td valign="top" width="80%">
<p>指定和数据感知对象相联系的数据集对象</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p>123</p>
</td>
<td valign="top" width="15%">
<p>CommandTimeout</p>
</td>
<td valign="top" width="80%">
<p>确定执行一个数据操作命令的时间</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p> </p>
</td>
<td valign="top" width="15%">
<p>CommandType1</p>
</td>
<td valign="top" width="80%">
<p>说明CommandText属性中的操作命令类型</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p>123</p>
</td>
<td valign="top" width="15%">
<p>Connection</p>
</td>
<td valign="top" width="80%">
<p>确定TADOStoredProc组件使用的ADO连接组件TADOConnection</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p>123</p>
</td>
<td valign="top" width="15%">
<p>ConnectionString</p>
</td>
<td valign="top" width="80%">
<p>指明数据库的连接信息</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p>123</p>
</td>
<td valign="top" width="15%">
<p>CursorLoction</p>
</td>
<td valign="top" width="80%">
<p>确定用ADO对象连接数据库时的游标位置</p>
<p>clUseClient: 本地机器游标(缺省)</p>
<p>clUseServer: 服务器游标</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p>123</p>
</td>
<td valign="top" width="15%">
<p>CursorType</p>
</td>
<td valign="top" width="80%">
<p>标识数据集使用的游标类型。取值:</p>
<p> ctDynamic: 动态游标(可以双向滚动)</p>
<p> ctKeyset: 集键游标(缺省)</p>
<p> ctOpenForwardOnly: 游标只能向前滚动</p>
<p> ctStatic: 静态游标(多用于报表)</p>
<p> ctUnspecified: 没有明确的游标位置被设置</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p> </p>
</td>
<td valign="top" width="15%">
<p>DatabaseName</p>
</td>
<td valign="top" width="80%">
<p>表明数据集联系的数据库名</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p>1</p>
</td>
<td valign="top" width="15%">
<p>DataSetField</p>
</td>
<td valign="top" width="80%">
<p>显示TdataSetField对象</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p>13</p>
</td>
<td valign="top" width="15%">
<p>DataSource</p>
</td>
<td valign="top" width="80%">
<p>连接另一个数据源的数据集</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p> </p>
</td>
<td valign="top" width="15%">
<p>DefaultIndex</p>
</td>
<td valign="top" width="80%">
<p>表明一个打开表格中的数据是否按默认的索引排序</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p> </p>
</td>
<td valign="top" width="15%">
<p>DBHandle</p>
</td>
<td valign="top" width="80%">
<p>表明数据集所在数据库BDE的句柄</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p>13</p>
</td>
<td valign="top" width="15%">
<p>EnableBCD</p>
</td>
<td valign="top" width="80%">
<p>确定是否将数字字段作为浮点数或二进制形式的十进制数</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p> </p>
</td>
<td valign="top" width="15%">
<p>Eof</p>
</td>
<td valign="top" width="80%">
<p>标志着记录指针是否停留在数据集的最后一个记录上</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p> </p>
</td>
<td valign="top" width="15%">
<p>Exclusive</p>
</td>
<td valign="top" width="80%">
<p>允许用户以专有的方式打开一个Paradox或dBASE表格</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p>123</p>
</td>
<td valign="top" width="15%">
<p>ExecuteOptions</p>
</td>
<td valign="top" width="80%">
<p>确定执行一个命令的性质。取值:</p>
<p>eoAsyncExecute: 命令被异步执行</p>
<p>eoAsyncFetch: 命令在初始化Cache属性所标识的记录数后,异步地提取剩下的记录</p>
<p>eoAsyncFetchNonBlocking: 执行任务时不阻止线程</p>
<p>eoExecuteNoRecords: 命令或存储过程没有返回值。如果命令或存储过程有返回值,则返回值将被舍弃</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p> </p>
</td>
<td valign="top" width="15%">
<p>FieldCount</p>
</td>
<td valign="top" width="80%">
<p>确定数据集的字段数</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p>1</p>
</td>
<td valign="top" width="15%">
<p>FieldDefs</p>
</td>
<td valign="top" width="80%">
<p>访问数据集定义的字段列表</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p> </p>
</td>
<td valign="top" width="15%">
<p>Fields</p>
</td>
<td valign="top" width="80%">
<p>指向数据集的字段列表</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p>123</p>
</td>
<td valign="top" width="15%">
<p>Filter</p>
</td>
<td valign="top" width="80%">
<p>表明当前数据集过滤的文本内容</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p>123</p>
</td>
<td valign="top" width="15%">
<p>Filtered</p>
</td>
<td valign="top" width="80%">
<p>表明一个数据集的过滤器是否被激活</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p> </p>
</td>
<td valign="top" width="15%">
<p>FilterOption</p>
</td>
<td valign="top" width="80%">
<p>设置过滤选项</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p> </p>
</td>
<td valign="top" width="15%">
<p>Handle</p>
</td>
<td valign="top" width="80%">
<p>允许程序直接调用API函数</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p>12</p>
</td>
<td valign="top" width="15%">
<p>IndexFieldNames</p>
</td>
<td valign="top" width="80%">
<p>显示数据库表格所采用的索引排序的字段名</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p> </p>
</td>
<td valign="top" width="15%">
<p>IndexFields</p>
</td>
<td valign="top" width="80%">
<p>指出数据库中的字段名列表</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p>12</p>
</td>
<td valign="top" width="15%">
<p>IndexName</p>
</td>
<td valign="top" width="80%">
<p>标识当前激活的索引</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p>123</p>
</td>
<td valign="top" width="15%">
<p>LockType</p>
</td>
<td valign="top" width="80%">
<p>在打开数据集时﹐LockType属性用于标识锁的类型。取值:</p>
<p> ltBatchOptimistic: 乐观批更新锁定,以批处理更新方式打开记录</p>
<p> ltOptimistic:乐观锁定,调用Post方法时才锁定记录</p>
<p> ltPessimistic: 悲观锁定,调用Edit方法时锁定记录</p>
<p> ltReadOnly: 只读,当前操作不能修改数据</p>
<p> ltUnspecified: 锁类型没有确定</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p>123</p>
</td>
<td valign="top" width="15%">
<p>MarshalOptions</p>
</td>
<td valign="top" width="80%">
<p>确定数据集中的哪些记录被写回到服务器中。取值:</p>
<p> moMarshalAll</p>
<p> moMarshalModifiedOnly</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p>12</p>
</td>
<td valign="top" width="15%">
<p>MasterFields</p>
</td>
<td valign="top" width="80%">
<p>设置主表的字段</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p> </p>
</td>
<td valign="top" width="15%">
<p>MasterSource</p>
</td>
<td valign="top" width="80%">
<p>指定作为数据集主表的data source组件的名字</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p>123</p>
</td>
<td valign="top" width="15%">
<p>MaxRecords</p>
</td>
<td valign="top" width="80%">
<p>确定从结果集返回的行数</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p> </p>
</td>
<td valign="top" width="15%">
<p>Modified</p>
</td>
<td valign="top" width="80%">
<p>标志着当前记录是否已被修改</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p>123</p>
</td>
<td valign="top" width="15%">
<p>Name</p>
</td>
<td valign="top" width="80%">
<p>该组件在被其它组件引用时的名字</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p> </p>
</td>
<td valign="top" width="15%">
<p>ObjectView</p>
</td>
<td valign="top" width="80%">
<p>指明字段在Fields porperty中是层次排列还是平铺</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p>13</p>
</td>
<td valign="top" width="15%">
<p>ParamCheck</p>
</td>
<td valign="top" width="80%">
<p>设置该属性可指定是否使用在CommandText属性中设置的SQL语句中的”: Param”格式的参数出始化Parameters属性</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p>13</p>
</td>
<td valign="top" width="15%">
<p>Parameters</p>
</td>
<td valign="top" width="80%">
<p>为存储过程传递参数或存储由存储过程返回的数据</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p>13</p>
</td>
<td valign="top" width="15%">
<p>Prepared</p>
</td>
<td valign="top" width="80%">
<p>确定ADO组件在执行命令前是否保存一个编译的版本</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p>1</p>
</td>
<td valign="top" width="15%">
<p>RDSConnection</p>
</td>
<td valign="top" width="80%">
<p> </p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p> </p>
</td>
<td valign="top" width="15%">
<p>RecNo</p>
</td>
<td valign="top" width="80%">
<p>RecNo就是记录在记录集中的序号</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p> </p>
</td>
<td valign="top" width="15%">
<p>RecordCount</p>
</td>
<td valign="top" width="80%">
<p>显示与数据集相连的记录的总数</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p>2</p>
</td>
<td valign="top" width="15%">
<p>ReadOnly</p>
</td>
<td valign="top" width="80%">
<p>表明一个数据表格在此应用程序中是否只读</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p> </p>
</td>
<td valign="top" width="15%">
<p>SessionName</p>
</td>
<td valign="top" width="80%">
<p>指定与数据集相连的Session的名字</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p>3</p>
</td>
<td valign="top" width="15%">
<p>SQL</p>
</td>
<td valign="top" width="80%">
<p>調用ADO查詢對象的ExecSQL或Open方法時,使用該屬性為該查詢對象提供需要的SQL語句</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p> </p>
</td>
<td valign="top" width="15%">
<p>State</p>
</td>
<td valign="top" width="80%">
<p>数据集的状态(运行时属性)。取值:</p>
<p>dsInactive: 数据集已关闭,不能访问数据﹔</p>
<p>dsBrowse: 数据集已打开,可以浏览数据,但是不能进行修改﹔</p>
<p>dsEdit: 数据集处于编辑状态,可以修改数据﹔</p>
<p>dsInsert: 此时可以插入一条新的记录﹔</p>
<p>dsSetKey: 可以设置范围和键值,也可以调用GotoKey函数,仅适用于TTable组件和TClientDataSet组件﹔</p>
<p>dsCalcFields: 正在处理OnCalcFields事件,不能修改非计算字段的值。</p>
<p>dsCurValue: 仅供系统内部使用</p>
<p>dsNewValue: 仅供系统内部使用</p>
<p>dsOldValue: 仅供系统内部使用</p>
<p>dsInternalCalc: 仅供系统内部使用</p>
<p>dsFilter: 正在进行数据过滤的操作</p>
<p>dsBlockRead: 当记录集指针移动到下一个记录时,数据感知组件不更新,事件不被触发</p>
<p>dsOpening: 数据集正在打开,但没有完成</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p>1</p>
</td>
<td valign="top" width="15%">
<p>StoreDefs</p>
</td>
<td valign="top" width="80%">
<p>指出数据库表格的字段和索引与数据模块一致﹐还是与窗体一致</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p>2</p>
</td>
<td valign="top" width="15%">
<p>TableDirect</p>
</td>
<td valign="top" width="80%">
<p>设置该属性可指定是简单地通过该数据表的名称访问该数据表(false,缺省),还是使用后台SQL语句访问数据表(ture)</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p>2</p>
</td>
<td valign="top" width="15%">
<p>TableName</p>
</td>
<td valign="top" width="80%">
<p>使用该属性可指定用于ADO数据表组件操作的基础数据表,TADOTable对象用于从中获得数据或修改其中的值。</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p> </p>
</td>
<td valign="top" width="15%">
<p>TableStyle</p>
</td>
<td valign="top" width="80%">
<p>指明该组件指向的数据表格的类型</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p>123</p>
</td>
<td valign="top" width="15%">
<p>Tag</p>
</td>
<td valign="top" width="80%">
<p>本地窗体整形变量标识号</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p> </p>
</td>
<td valign="top" width="15%">
<p>UpdateMode</p>
</td>
<td valign="top" width="80%">
<p>决定BDE如何在SQL数据库中查询更新的记录</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p> </p>
</td>
<td valign="top" width="15%">
<p>UpdateObject</p>
</td>
<td valign="top" width="80%">
<p>指出在允许缓存更新时﹐用来更新只读记录的update object组件</p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p> </p>
</td>
<td valign="top" width="15%">
<p> </p>
</td>
<td valign="top" width="80%">
<p> </p>
</td>
</tr>
<tr>
<td valign="top" width="3%">
<p> </p>
</td>
<td valign="top" width="15%">
<p> </p>
</td>
<td valign="top" width="80%">
<p> </p>
</td>
</tr>
</tbody>
</table>
</div>
<div id="MySignature" role="contentinfo">
好的代码像粥一样,都是用时间熬出来的<br><br>
来源:https://www.cnblogs.com/jijm123/p/11280431.html
頁:
[1]