1、第十八章 利用dbExpress开发 数据库程序dbExpress为C+Builder 6后才新增加的数据库连结方式,透过一系列轻量级的驱动程序来达到和数据库快速连结的目的,而最主要的目的则是为了和Kylix兼容。Kylix为Borland推出的Linux平台下程序开发软件,透过C+或Object Pascal语法的使用让C+Builder/Delphi的使用者能快速的开发或移植程序到Linux平台上,做到Write Once,Run Everywhere的最终目标,所以dbExpress的推出主要在克服BDE、ADO不兼容于Linux的缺点,此外,dbExpress连结方式也因为具有免事先设
2、定、携带容易、速度快和消耗资源少等优点而成为Borland公司目前全力支持的连结架构。大纲18-1dbExpress连结简介18-2SQLConnection组件18-3SQLDataSet组件18-4SQLQeury组件18-5SQLTable组件18-6SQLMonitor组件的使用18-1.dbExpress连结简介dbExpress因为在效能和使用上都有不错的表现而成为Borland公司目前全力支持的连结方式,不论是Delphi、Kylix和C+Builder 都可以看到该连结组件的踪影,而对于要开发能适用于Windows和Linux两个操作系统下数据库程序的程序设计师来说,使用dbE
3、xpress更是目前唯一可行的方式,和传统的BDE连结方式相比,该架构最大的不同在于采用单向指标和取消了缓冲存储器的使用,而非过去的靠缓冲储存器辅助来实作双向指标,虽然换来效能上的提升,但也相对了增加一些使用上的限制,底下为该架构和传统BDE所不同的地方1.只支持数据集合中的First和Next方法。因为单向指针的限制导致指针在数据集合内只能单向的往下移动和回到第一笔数据的位置,而无法像双向指标可以自由的往上或往下移动指标。18-1.dbExpress连结简介2.没有对编辑模式的内建支持。因为过去对数据集合内记录的修改(Edit方法)需要额外缓冲存储器的支持来储存这些修改动作,但是由于dbEx
4、press本身并没有使用到缓冲存储器,所以自然无法执行过去的编辑模式,而解决方式则是使用SQL语法中的Update来直接进行修改的动作,或是透过其它使用缓冲存储器的组件来辅助,如连结数据集合至ClientDataSet组件。3.不支持数据集合内的Filter属性,也就是说无法对传回来的数据集合设定过滤条件,因为过滤器的使用同样也需要缓冲存储器的支持,所以当你在dbExpress连结方式中使用Filter属性将会触发例外处理的产生,解决的方式是使用SQL语法直接对远程数据库下过滤条件的设定,而非等数据集合已经形成后再进行筛选的动作。4.不支持Lookup字段的设定,因为Lookup字段同样需要使
5、用缓冲存储器来储存相关的字段值。18-1.dbExpress连结简介综合以上的使用限制可以知道,所有用到缓冲存储器的数据集合属性和方法在dbExpress下是不被允许的,所以对于需要缓冲存储器辅助的感知组件当然也无法使用,包括最为熟知的DBGrid、DBLookupListBox和DBLookupComboBox等组件,不过,如果不考虑这些限制的话,dbExpress因为单向指标的使用而成为C+Builder下最快速的数据链路机制,且在使用和安装部署上亦是最为简单的。所有dbExpress组件皆位在组件样版内的dbExpress页次中,功能不外乎和数据库相连、对数据库进行存取和传回指向数据集合
6、的单向指针。18-1.dbExpress连结简介 简略介绍各组件功能如下:SQLConnection组件 负责使用dbExpress连结方式和数据库建立连结的管道,如果读者熟悉ADO组件的话,该组件的功能类似ADOConnection。SQLDataSet组件 C+Builder提供的四个单向数据集合组件之一,同时也是四个之中最一般化的组件,不论有无回传数据集合的指令皆可透过CommandText属性的指定加以执行,相当类似于ADODataSet组件的使用方式。SQLTable组件 读取表格为主的数据集合组件,透过指定表格名称的方式来读取数据,而回传的数据集合仅能透过First和Next方法进
7、行检视。18-1.dbExpress连结简介 SQLQuery组件 查询形式的数据集合组件,也就是完全透过SQL语法的方式对数据库下执行指令,包括回传数据集合的Select指令或是没有回传集合的DDL语法。SQLStoredProc组件 该组件的功能在于执行数据库内定义的Stored Procedure,并接收Stored Procedure所传回来的数据集合或执行结果。18-2.SQLConnection组件SQLConnection组件负责和数据库间的连结建立,与BDE连结不同的是:它不需要BDE Administrator之类工具的数据库连结设定,而采用和ADO相似的设定方式,至于详细的
8、设定步骤则分为1.驱动程序的指定驱动程序的指定和2.参数参数的传递的传递1.驱动程序的指定:使用dbExpress连结所需要的数据库驱动程序分为两个档案:一个是dbExpress本身的驱动程序,为一个动态连结函式库的DLL文件,根据使用的数据库不同而对应到不同的DLL档,预设提供INTERBASE、ORACLE、MYSQL和DB2四种数据库的驱动程序版本,对应的DLL档案分别为dbexpint.dll、dbexpora.dll、dbexpmys.dll和dbexpdb2.dll另外一个则为数据库厂商对于Client端提供的动态联结函式库(DLL),也是随着不同厂商而不同。不过,使用者其实并不需
9、要在意究竟是使用了上述的哪两个DLL档,因为当我们设定SQLConnection的DriverName属性时,SQLConnection会根据dbxdrivers.ini自动选择对应的DLL档来使用。18-2.SQLConnection组件2.参数的传递指定了驱动程序后,便需要透过参数的传递设定连结的数据库,这些常用的参数包括Database(数据库名称)、User Name(使用者名称)、Password(登入密码)、Host Name(联机主机)等,不同数据库的参数设定内容不尽相同。为了设定方便,当指定DriverName属性后,SQLConnection会根据DriverName的设定值
10、提供对应的参数列表供设定者参考。这些参数中,以Database参数为最基本且必备的设定,该Database参数值来源随数据库的种类而不尽相同,像INTERBASE的Database便是根据.gdb档案的名称来决定,Oracle则根据TNSNames.ora中的设定,至于DB2则为Client端的节点名称(node name)。上述的设定还可透过连结编辑器连结编辑器的辅助来省去我们设定的麻烦,如下一小节中所述。18-2-1.连结编辑器的使用双击窗体上的SQLConnection组件开启连结编辑器的设定画面,如右图所示,在预设的画面中,会提供五个代表不同数据库的连结名称(Connection Na
11、me)供使用者直接进行设定。在此,我们选择建立一个新的连结名称来介绍连结编辑器的使用方式,请点选光标所指的按钮以建立一个新的连结。18-2-1.连结编辑器的使用按下【+】的按钮后便会弹出如下图所示的对话框,在对话框中要求设定的数据库的驱动程序,即连结的数据库类型,共有 DB2、INTERBASE、Informin、MySQL、Oracle五种不同的驱动程序可供选择,除此,在Connection Name输入框中输入该连结的识别名称,这里我们以MySQL为示范,Connection Name为Example。选择驱动程序类型18-2-1.连结编辑器的使用按下【OK】按钮后对该连结进行细步设定,画
12、面如右图所示:依照实际连结的MySQL数据库设定 HostName(MySQL主机位置)Database(连结数据库)User_Name(使用者名称)Password(密码)四个属性值接着透过对象检视器设定SQLConnection组件的VendorLib属性值至libMySQL.dll路径所在,如右图所示:说明:一般安装数据库所附的Client端软件后,VendorLib属性值的路径会自动连结而不需额外指定。18-2-1.连结编辑器的使用回到连结设定画面按下【】按钮测试设定是否正确,登入数据库后弹出如下图画面即表示连结成功。18-2-2.SQLConnection的使用在完成使用连结编辑器对
13、数据库的连结设定后,透过SQLConnection连结数据库便成为一个简单的工作了,而设定SQLConnection最重要的部份就在于ConnectionName属性值的指定,下面为该组件使用的基本三步骤。1.透过对象检视器设定SQLConnection组件的ConnectionName属性以指定连结的数据库,至于ConnectionName属性的设定来源则取决于连结编辑器中的纪录。当ConnectionName属性值选定后,DriverNmae、LibraryName和VendorLib三个属性值会自动随着ConnectionName设定而变动,并对应到之前在连结编辑器中的设定,因此,只要设
14、定好ConnectionName属性值就代表完成了该组件的大部分设定,尤其是连结驱动程序的指定上。18-2-2.SQLConnection的使用2.透过LoginPrompt属性的设定来控制密码对话框的出现与否;倘若ConnectionName内容已经纪录了使用者名称和密码的信息,则可以设定LoginPrompt属性为False以关闭密码对话框,省去每次SQLConnection组件和数据库连结时弹出密码框的麻烦。3.设定Connected属性值为True和远程数据库建立联机,至于KeepConnection属性则设定该组件和数据库之间是否永远保持连结状态,纵使没有其它SQLTable、SQL
15、DataSet或SQLQuery组件透过该组件和数据库连结。18-2-3.SQLConnection常用属性属性功能ActiveStatements 传回目前透过该连结所执行的指令数目,也就是所有透过SQLConnection和数据库连结的SQLDataSet、SQLTable和SQLQuery等组件目前执行的指令数目,包括Prepared、Open和Execute,而这些指令的生命周期必须等到对应的指令下达或是执行动作完毕后才结束,像Open方法建立的连结就必须等到Close方法的呼叫后才结束,而Prepared=True的动作也在Prepared=False后才结束作用。MaxStmtsP
16、erConn该属性传回数据库对每个连结在同一时间所允许的最大执行指令数目,当回传值为0时表示该数据库并没有限制连结所能执行的指令数目;大于0则限制了指令执行的数目,例如回传值为2,就代表只允许每个连结在同时间执行两个指令,另外,该属性只有在Connected=True时才有作用。18-2-3.SQLConnection常用属性属性功能AutoClone 设定当ActiveStatements属性值大于MaxStmtsPerConn时,是否要自动复制一个SQLConnection连结以解决执行指令数目过多的问题,若AutoClone为True,表示会自动复制一个相同属性值的SQLConnecti
17、on组件来解决过多指令无法同时执行的限制;AutoClone为False时则产生例外处理告知执行指令过多,当然,还可透过CloneConnection方法的呼叫来复制一个联机,默认值为True。ConnectedConnectionNameConnectionName设定SQLConnection组件所使用的连结名称,Connected属性则决定是否开启和数据库的连结。18-2-3.SQLConnection常用属性属性功能ConnectionState 透过不同的属性值回传可以了解SQLConnection组件目前的连结状态,属性值如下说明:csStateClosed:Connected属性
18、值为False,没有和数据库连结。csStateOpen:Connected属性值为True,和数据库连结中。csStateConnecting:正在建立连结,但是尚未完成连结的动作。csStateExecuting:已经传递SQL指令给远程的数据库,且正在执行中。csStateFetching:正在从数据库抓取数据。csStateDisconnecting:正在关闭连结,不过尚未完成关闭动作。18-2-3.SQLConnection常用属性属性功能DataSetCount在SQLConnection组件中,很多数据集合组件如SQLDataSet均会透过该组件和数据库相连,而DataSetCo
19、unt属性则用来传回这些相连的数据集合组件中Active属性值为True的个数,透过这个数目可以知道哪些组件正在和数据库相连。DataSets这是一个记录透过SQLConnection和数据库相连且Active属性值为True的数据集合数组,搭配DataSetCount的使用,我们可以对所有Active为True的数据集合组件进行处理的动作。LoginPrompt这是一个记录透过SQLConnection和数据库相连且Active属性值为True的数据集合数组,搭配DataSetCount的使用,我们可以对所有Active为True的数据集合组件进行处理的动作。18-2-4.SQLConnec
20、tion常用方法 CloneConnection 此方法能产生一个相同的SQLConnection组件,当AutoClone属性设为False时,可用此方法手动建立一个新的SQLConnection。CloseDataSets 呼叫SQLConnection组件的CloseDataSets方法能关闭所有透过该SQLConnection组件连结到数据库的数据集合组件,但不影响SQLConnection组件本身和数据库之间的联机。18-2-4.SQLConnection常用方法 Execute SQLConnection组件除了建立联机外,亦可以直接对数据库进行指令执行的动作,而这SQL语法的指令
21、以不会回传数据集合的DDL最为适合,因为SQLConnection本身并非数据集合组件,至于使用格式如下所示:SQL用来指定所要执行的SQL语法。Params设定SQL语法内使用的变量值。当SQL语法回传数据集合时,透过ResultSet来记录回传集合的指针。不过建议读者还是使用其它如SQLDataSet组件来处理数据集合回传的应用。最后,该函式会传回数据库中被该SQL语法影响的数据笔数。Function Execute(const SQL:string;Params:TParams;ResultSet:Pointer=nil):Integer18-2-4.SQLConnection常用方法程
22、序范例如下:TParams*myParams=new TParams;tryAnsiString sqlCommand;SQLConnection1-Connected=true;myParams-CreateParam(ftString,Tel,ptInput);myParams-ParamByName(Tel)-AsString=1234567;myParams-CreateParam(ftString,CellPhone,ptInput);myParams-ParamByName(Tel)-AsString=0912345678;sqlCommand=INSERT INTO employ
23、ee(Id,Name,Gender,Tel,CellPhone);sqlCommand+=VALUES(9012121,Kevin,M,:Tel,:CellPhone);SQLConnection1-Execute(sqlCommand,myParams,NULL);_finallydelete myParams;说明:程序代码先宣告一个型态为TParams的变量myParams供储存SQL语法内的变量使用(Tel和CellPhone两个变量),而sqlCommand变量则为所要执行的SQL指令,最后透过Execute方法的呼叫来执行sqlCommand指定的SQL指令。18-2-4.SQLC
24、onnection常用方法 ExecuteDirect ExecuteDirect方法执行没有变量传入的SQL语法。当SQL语法内不含变量时,便可使用ExecuteDirect方法代替Execute,如果执行正确,回传值为0,否则回传dbExpress的错误编号。GetFieldNames 针对某个数据表,呼叫GetFieldName可以回传该数据表的所有字段,使用方式如下:/读取Employee数据表中的所有字段,便显示在ComboBox1中SQLConnection1-GetFieldNames(Employee,ComboBox1-Items);18-2-4.SQLConnection常
25、用方法 GetTableNames 读取SQLConnection连结账号所能存取的所有数据表名称,并储存在TStrings型态的变量下,而透过参数的指定亦可选择是否要一并读取系统数据表,使用方式如下:Close和和Open Close关闭SQLConnection和数据库的连结,而Open则开启和数据库之间的连结。/选取所有数据表,并储存在ComboBox1中,不过不含系统数据表(False参数值指定)SQLConnection1-GetTableNames(ComboBox1-Items,False);/选取所有数据表,并储存在ComboBox1中,包括系统数据表在内(True参数值指定)
26、SQLConnection1-GetTableNames(ComboBox1-Items,True);18-2-4.SQLConnection常用事件事件说明OnLogin当LoginPrompt属性为True时,OnLogin事件在数据库连结前发生,用以指定登入数据库时可能需要的参数。如果OnLogin事件处理了连结数据库所需的参数,则登入对话框将不会出现。BeforeConnect在连结数据库前发生。AfterConnect在连结数据库后发生。BeforeDisconnect在中断数据库连结前发生。AfterDisconnect在中断数据库连结后发生。18-3.SQLDataSet组件 透
27、过SQLConnection建立起数据库连结后,便可使用dbExpress方式存取数据库中的数据,而本节将介绍最基本的SQLDataSet组件,因为它不但允许直接指定数据表来显示数据,也允许透过SQL语法对数据库进行存取的动作,另外还支持Stored Procedure的使用和接收Stored Procedure的回传值,可说是包办了所有存取远程数据库内容的动作。18-3-1.基本设定 在SQLDataSet的使用上,若要对数据库内的数据进行存取的动作,则整个设定不外乎选择连结名称、指定执行指令和执行指令三个步骤,各步骤简述如下:选择连结名称 在dbExpress中和数据库的连结主要决定在连结
28、名称的设定上,所以第一步便是要决定透过哪个连结名称和数据库达到连结的目的,不过,因为SQLDataSet本身并不具备和数据库直接连结的能力,所以我们要使用SQLConnection组件来达成间接连结的目的,也就是必须透过SQLConnection属性的指定来选择使用的SQLConnection组件,并利用SQLConnection组件的设定和数据库进行连结,因此请开启对象检视器并设定SQLDataSet组件的SQLConnection属性为你所欲使用的SQLConnection组件,当然,在设定前请先设定好SQLConnection组件的属性。18-3-1.基本设定 指定执行指令 在选定连结名
29、称后,透过对CommandText属性的指定来对数据库下达执行指令。比较特殊的是,该CommandText并不局限在SQL语法的使用,也允许指定数据表或预存函式的名称,因此还必须靠CommandType属性的配合来决定CommandText的内容型态,底下为两者之间的对应关系:CommandType属性值CommandText内容型态ctQuery一般的SQL语法内容ctStoredProc直接输入预存函式的名称ctTable直接输入表格名称(该属性值下的回传数据集合只具备只读功能)18-3-1.基本设定 SQL语法的使用范例则如下面程序代码所示:/透过SQL语法的指定方式SQLDataSet
30、1-CommandType=ctQuery;SQLDataSet1-CommandText=Select*from DEPARTMENT;/直接指定Table名称SQLDataSet1-CommandType=ctTable;SQLDataSet1-CommandText=DEPARTMENT;18-3-1.基本设定 执行指令 执行CommandText的内容。根据内容种类的不同有两种主要的执行方法:Open和ExecSQL Open方法负责执行会有数据集合回传值的CommandText内容,像Select或是选取表格之类的动作便是透过Open来开启 ExecSQL则处理不具有回传值的Comm
31、andText,像是Insert或是Update等,不过,和过去熟悉的ExecSQL所不同的是:SQLDataSet的ExecSQL为一个需要传入布尔值的函式,利用该传入的布尔值来设定是否直接执行CommandText所指定的动作,倘若CommandText没有参数的传入则设定布尔值为True来直接执行指令,否则应传入布尔值False对CommandText指令进行最佳化的动作,默认值为False。另外,CommandText内容被数据库执行后,亦会透过ExecSQL函式传回被影响的数据笔数。18-3-1.基本设定 用法示范SQLDataSet1-CommandType=ctQuery;SQL
32、DataSet1-CommandText=“INSERT INTO EMPLOYEE(Name,Id,Tel)VALUES(:Name,:Id,:Tel)”;/执行Insert新增一笔数据SQLDataSet1-Params-Items0-AsString=Cherry;SQLDataSet1-Params-Items1-AsString=9922111;SQLDataSet1-Params-Items2-AsString=88543;SQLDataSet1-ExecSQL(False);18-3-2.SQLDataSet的存取动作 SQLDataSet组件为数据集合组件,所以除了不支持dbE
33、xpress单向指标的方法外,大致上的使用方式仍和传统的数据集合组件相同,因此在存取字段值的应用上亦和其它数据集合组件大同小异,不外乎透过Fields、FieldByName和FieldValues;不过,或许是因为一些数据感知组件不支持dbExpress,导致使用这些方法来存取字段值的机会比BDE或ADO连结方式多上许多,其中最明显的就是必须用StringGrid之类的组件来取代DBGrid作为显示数据集合的内容;此外,SQLDataSet组件亦提供了其它好用的方法来读取更多的表格信息,譬如GetFieldData和GetKeyFieldNames就分别提供了读取数据表字段和索引的功能。在下
34、面我们以范例来说明SQLDataSet的使用方式。18-3-2.SQLDataSet的存取动作【范例范例18-1】根据选取字段显示窗体内容根据选取字段显示窗体内容 透过GetTableNames方法和StringGrid组件的使用完成显示窗体内容的程序。而本章所有范例使用的数据表架构如下图所示:18-3-2.SQLDataSet的存取动作窗体画面属性组件ConnectedNameConnection NameDriver NameLogin PromptSQLConnectionSQLConnectionTrueSQLConnection1ExampleMySQLFalse-SQLDataSe
35、t-SQLConnection1说明:SQLConnection组件的ConncectionName属性设定请参考18-2节,而VendorLib属性则指向libMySQL.dll档案所在的位置,在SQLConnction所有属性设定完毕后,设定Connected=True和远程进行连结。重要组件属性18-3-2.SQLDataSet的存取动作 主要程式碼(參閱書附光碟)【执行结果】【执行结果】依照选定的显示字段,按下【Show】按钮即可显示数据表内容。18-3-3.SQLDataSet常用属性属性功能CommandType设定CommandText的类型。CommandText对数据库执行的
36、内容,依据CommandType设定的类型而不同。DataSource使用SQLDataSet组件建立Master/Detail主从数据表时使用。Detail端的SQLDataSet组件利用该属性来指定Master数据表的来源,也就是指定一个记录Master数据表来源的DataSource。ParamsCommandText中指定的SQL语法或是StoredProc含有参数时,便可透过该属性来传递参数。CommandText内的参数以数组方式储存,并依照先后顺序排列。Prepared设定是否在CommandText指令执行前,进行准备的动作,也就是最佳化的处理,尤其是指令含有参数时,设定Pre
37、pared=True会改善执行的效能。18-3-3.SQLDataSet常用属性属性功能RecordCount用来传回数据集合内目前的数据笔数,但是当数据集合并没有办法决定整个集合内的数据笔数时,将产生例外处理的情形,底下为三种无法使用该属性的数据集合:1.资料集合表示的是预存函式(Stored Procedure)。2.数据集合表示的是一个含有参数的查询,也就是Query中含有参数的设定。3.数据集合表示的是多个资料表的结合。SortFieldNameCommandType为ctTable型态时,透过SortFieldNames属性的设定可决定数据显示的排序情形,相当于SQL语法中的Orde
38、r By用法。若要对多字段进行排序时,只要以分号间格字段即可,依照输入的优先级排序。数据集合的其它属性请参考BDE或ADO数据集合组件的说明。18-3-4.SQLDataSet常用方法 ExecSQL和Open 负责执行CommandText属性值所设定的指令,当会回传数据集合时使用Open,否则使用ExecSQL,更详细的说明请参考18-3-1小节。GetFieldData 该方法能根据所使用的数据表传回数据表内的所有字段。ParamByName 和Params属性同样都是用来传递或指定参数内容,只是该方法以参数名称来指定参数值,非Params所使用的编号方式。18-3-4.SQLDataS
39、et常用方法 Next和First 为dbExpress数据集合内,移动数据集合指针仅能使用的方法。因为dbExpress单向指针的缘故,所以过去数据集合中能使用的Prior、MoveBy和GotoBookmark等移动指标的方法皆无法使用。说明:单向指针的数据存取在效能上优于双向指标,但相对的牺牲了许多数据集合组件所提供的方法,如Prior、Insert、Delete、Locate等,因此,建议读者养成使用SQL语法执行数据库存取动作的习惯。18-4.SQLQuery组件SQLQuery组件为使用SQL语法对数据库进行存取动作的数据集合组件,在使用上和BDE下的Query 与ADO下的ADO
40、Query有着几分类似,因此如果对于前面两个组件已经有所认识的读者来说,对该组件的上手也就变得简单许多,不过由于该组件完全仰赖SQL语法来对连结的数据库或数据表进行存取的动作,所以建议读者在学习本组件前最好对SQL语法有一定的熟悉度。SQLQuery组件的基本操作和18-3介绍的SQLDataSet极为类似,透过SQLConnection属性的指令完成和数据库的连结设定,而SQL属性则决定所要执行的SQL语法内容,而执行的方法则依回传值的与否有Open和ExecSQL之分:Open限用于回传数据集合的指令;ExecSQL则用于不会回传数据集合的指令。18-4-1.使用SQLQuery存取数据【
41、范例范例18-2】新增删除数据表的内容新增删除数据表的内容 透过SQLQuery组件的使用,允许使用者新增/删除数据表中的数据。窗体画面属性组件NameConnectedConnection NameDriver NameLogin PromptSQLConnectionSQLConnectionSQLConnection1TrueExampleMySQLFalse-SQLQuery-SQLConnection1属性组件NameOptionsItemIndexCaptionColumnsItemsStringGridStringGrid1goRowSelect=true-RadioGroupR
42、adioGroup1-0【不输入】2男女说明:Edit输入框并没有做输入长度的检查动作,读者可自行使用Edit组件的MaxLength属性来设定所允许的最长输入。18-4-1.使用SQLQuery存取数据主要程式碼(參閱書附光碟)【执行结果】【执行结果】在输入框中填入数据,按下【输入】按钮即完成对数据表的输入,而在StringGrid显示框中双击鼠标即可删除所点选的那笔纪录。新增资料前新增资料后18-4-2.SQLQuery常用属性属性功能DataSource在建立Master/Detail数据表时,Detail数据表透过该属性指定Master数据表的来源Eof判断数据指针是否指到数据集合中的
43、最后一笔纪录。Bof判断数据指针是否指到数据集合中的第一笔纪录。Params当SQL语法含有参数时,透过这属性设定参数内容。Prepared当SQL语法含有参数时,设定Prepared=True来进行最佳化的准备工作。RecordCount回传SQLQuery目前的数据集合内所拥有的资料笔数。RowAffected计算SQL语法执行后数据集合内被影响的数据笔数。SQLQuery组件为数据集合组件,所以可使用继承至数据集合组件的大部分属性。18-5.SQLTable组件 SQLTable组件为直接指定数据表作为读取依据的dbExpress数据集合组件。和SQLQuery相比,不需要对SQL语法有
44、任何了解即可读取数据表的内容是它最主要的优势,但相对的,在复杂的存取应用上就显得力不从心了,何况该数据集合只具备单纯的只读功能,所以实际应用上的取舍还是决定在你对数据表格的动作而定,当然你也可以直接使用SQLDataSet组件来包办SQLQuery和SQLTable两个组件的工作。18-5-1.SQLTable的基本操作 SQLTable组件的基本设定还是维持一贯的简单原则,只需先透过SQLConnection属性指定一个SQLConnection组件作为连结的依据再利用TableName属性决定数据表名称即完成基本的操作,而若是透过对象检视器来指定TableName属性,对象检视器还会根据所
45、设定的SQLConnection属性提供可用的数据表列表,可说是再方便不过了,最后再设定Active属性为true即可读取数据表的内容。18-5-2.SQLTable的Master/Detail设定不论是BDE中的Table组件、ADO中的ADOTable组件到dbExpress中的SQLTable组件,Borland皆贴心的提供了字段编辑器供程序设计员使用,而透过字段编辑器的快速拖曳功能,可以自动产生显示字段内容的数据感知组件,避免因为重复设定所产生的错误,进而缩短程序的开发时间,详细的使用方法请参考16-1-2节中的说明;不过由于SQLTable为单向指针的数据集合组件,所以并不支持在BD
46、E和ADO中常使用到的Lookup字段设定,但是仍可透过DataSource组件的辅助完成Master/Detail的数据库程序开发。Master/Detail数据库程序需要两个数据集合组件的使用,其中一个为Master数据集合;另一个为Detail数据集合,两者之间透过字段设定对应的关系,因此Detail端指定Master数据来源就成为设定对应字段的第一步:透过对象检视器设定Detail数据集合的MasterSource属性以选择Master数据表的来源,接着点选MasterFields属性设定Detail/Master所要对应的字段即完成了Master/Detail数据表的对应关系18-5
47、-2.SQLTable的Master/Detail设定底下为设定步骤的流程:SQLTable1SQLTable2DataSource118-5-2.SQLTable的Master/Detail设定【范例【范例18-3】Master/Detail的应用的应用 透过Master/Detail数据表的设定,建立employee和orders两个数据表间的关联:根据employee资料表内的员工编号查询orders数据表内该员工所有的接单纪录。窗体画面18-5-2.SQLTable的Master/Detail设定属性组件NameDataSourceDataFieldCaptionColumnsItem
48、sValuesDBEditDBEdit1DataSource1Id-DBEditDBEdit2DataSource1Name-DBEditDBEdit3DataSource1Tel-DBEditDBEdit4DataSource1CellPhone-DBRadioGroupDBRadioGroup1DataSource1Gender【空白】2男女MF属性组件NameActiveIndexFieldNameMaster FieldsMaster SourceTableNameSQLConnectionSQLTableSQLTable1False-EmployeeSQLConnection1SQL
49、TableSQLTable2FalseEmpNoIdDataSource1OrdersSQLConnection1说明:DBRadioGroup透过Items和Values属性设定显示值和数据表字段值之间的关系。当Gender字段值为“M”时,DBRadioGroup的“男”选项会呈现选取的状态,反之,“女”呈线选取的状态。SQLConnection设定请参考前面范例。DataSource组件的Name为DataSource1,设定其DataSet属性为SQLTable1。18-5-2.SQLTable的Master/Detail设定 主要程式碼(參閱書附光碟)【执行结果】【执行结果】18-6
50、.SQLMonitor组件 SQLMonitor组件监视应用程序和数据库之间的讯息传递情形,透过这些讯息的检视可以了解dbExpress连结和数据库实际的沟通方式,有助于程序除错时对应用程序和数据库间传递内容的了解:包括语法是否传递正确或是指令是否确实执行等,而本组件的作用和 BDE下提供的SQL Monitor工具极为类似,只不过SQL Monitor为一个应用程序,SQLMonitor为C+Builder内的一个组件。18-6-1.基本使用SQLMonitor主要针对程序除错(Debug)之用,所以能提供的功能就相对有限,因此在组件设定上的变化也相对减少许多。以最基本的使用来说,你只要指定