首页 C++_Builder的ADO组件

C++_Builder的ADO组件

举报
开通vip

C++_Builder的ADO组件 ※ 1 ※ C++ Builder的 ADO组件 内容提要:本文介绍了如何使用 ADO 组件。利用 ADO 组件编写数据库组件可以绕开 BDE 和 数据库进行联系,ADO 组件在其他编程语言中也十分通用,学习 ADO 可以缩短熟悉其他语言的时 间。 关键字:ADO 组件、BDE 组件 引言: ADO 组件和 BDE 组件访问数据库的步骤差不多,一般都有对应的组件。如 TADOConnection 组件和 TDatabase 组件类似,用于连接到数据库。TADODataSet、TADOQuery...

C++_Builder的ADO组件
※ 1 ※ C++ Builder的 ADO组件 内容提要:本文介绍了如何使用 ADO 组件。利用 ADO 组件编写数据库组件可以绕开 BDE 和 数据库进行联系,ADO 组件在其他编程语言中也十分通用,学习 ADO 可以缩短熟悉其他语言的时 间。 关键字:ADO 组件、BDE 组件 引言: ADO 组件和 BDE 组件访问数据库的步骤差不多,一般都有对应的组件。如 TADOConnection 组件和 TDatabase 组件类似,用于连接到数据库。TADODataSet、TADOQuery、 TADOCommand 用于查询和操作数据库,数据感应组件用于和用户进行交流。 正文: C++ Builder 的 ADO 组件绕开 BDE,通过 ActiveX Data Object 连接数据库。ADO 是 Windows 环境下非常流行的数据库连接技术,利用了 ActiveX 技术。使访问数据库有了统一的标准。ADO 可 以用于各种开发语言,只要是支持 ActiveX 的地方都可以使用 ADO,如 ASP 等等。 C++ Builder 提供了数个关于 ADO 的组件,以完成对 ADO 的调用。这几个 ADO 组件的功能如 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 1 所示。 表 1 ADO 组件 组件 作用 TADOConnection 这个组件用于建立到数据库的连接,可供其他数据集使 用。地位就像 BDE 编程中的 Database 组件 TADODataset 这是一个数据集组件,可以向 DataSource 组件提供数 据。可以根据 SQL 语句从数据库中接收数据 TADOTable 这个组件可以从数据库中的指定的一个表中获取数据, 可以连接到 TADOConnection 组件上 TADOQuery 可以根据 SQL 语句生成数据集,可以执行数据定义语句 (DDL) TADOStoredProc 用于执行储存过程,并接收储存过程的结果数据 TADOCommand 用来执行不会返回数据的 SQL 语句 表 1 列出的 TADODataset、TADOTable、TADOQuery 和 TADOStoredProc 都是数据集组件,可 以向 DataSource 提供数据,可以在代码中通过直接获取数据库中的值。都可以自己连接到数据库中, 也可以通过 TADOConnection 连接到数据库。通常使用后面的方法,因为后面这种方法可以让多个 数据集组件共享一个专门连接到数据库的 TADOConnection 组件。 当连接有变化时,只需要改动 TADOConnection 即可。BDE 中很多组件都和这些组件一一对应, 如 TTable 对应 TADOTable、TStoredProc 对应 TADOStoredProc。但没有组件和 TADODataset 对应。 1 使用 ADO组件连接数据库 1.1 使用 TADOConnection 组件连接数据库 使 用 ADO 组 件 要 先 连 接 到 数 据 库 , 可 以 用 TADOConnection 组 件 完 成 这 个 工 作 。 TADOConnection 组件的图标如图 1 所示。 图 1 TADOConnection 组件 下面介绍如何使用 TADOConnection 组件连接 Access 数据库。首先,从 ADO 组件页中拖动一 个 TADOConnection 到窗体中。当然,也可以把它放到数据模块中。把非可视模块放到数据库模块 中有利于组织结构,因为其他窗体中也可以方便地引用数据模块中的组件。 ※ 2 ※ 编辑 TADOConnection1 的 ConnectionString 属性,这个属性是一个字符串,说明如何连接到数 据库中。出现一个如图 2 所示的对话框。 图 2 建立 ConnectionString 【Use Data Link File】表示读入一个包含连接字符串的文件。【Use Connection String】表示连接 字符串,可以手工键入连接字符串,不过通常没有人这么做,因为利用【Build】按钮可以方便的生 成那些难以记忆的语法符合。 单击【Build】按钮,进入“数据链接属性”对话框,这个对话框是 Windows 系统提供的,在 其他地方使用 ADO 的时候也会利用到这个对话框。 “数据链接属性”对话框如图 3 所示。 图 3 数据链接属性对话框 在这个对话框中选择驱动程序 Microsoft Jet 是连接 Access 数据库的驱动程序,3.51 版对应的是 Access 97 的数据库,4.0 版对应的是 Access 2000 和 Access 2002 的驱动程序。选择 Microsoft Jet 4.0 OLE DB Provider 驱动程序后单击【下一步】按钮,出现如图 4 所示的对话框。 图 4 指定数据库 在如图 4 所示对话框中,可以输入数据库文件的路径。Access 数据库储存在 MDB 文件中。还 可以通过单击【测试连接】按钮检查数据库文件是否正常。 ※ 3 ※ 单击【确定】按钮,回到如图 2 所示的对话框,而且连接字符串已经填入了。连接字符串通常 是 下 面 这 样 的 格 式 : “ Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\June\ New\Server\Doc\CVS_DB.mdb;Persist Security Info=False”。可以看到,连接字符串的“Data Source” 指定了数据库的文件路径,也可以把它改为相对路径。 通过把 TADOConnection 组件的 Connected 属性设为 true 或者调用 Open 方法可以激活连接。省 缺情况下,激活连接会弹出一个输入框接收登陆信息,如果不希望它出现,可以把 TADOConnection 的 LoginPrompt 属性设为 false。如果与 TADOConnection 关联的数据集组件被激活,那么这个 TADOConnection 组件也会被激活。要关闭连接,可以把 TADOConnection 组件的 Connected 属性设 为 false 或调用 Close 方法。 在使用 TADOConnection 过程中,可以检测它的 State 属性以获得这个 TADOConnection 组件的 状态。State 的取值及含义如表 2 所示。 表 2 TADOConnection 组件 State 属性的含义 取值 说明 stClosed 连接处于关闭状态 stOpen 连接处于打开状态 stConnecting 正在连接中 stExecuting 正在执行状态 stFetching 正从数据库系统中取回数据 下面介绍一些 TADOConneciton 常用到的属性: ( 1 ) ConnectOptions 属 性 指 定 数 据 库 连 接 使 用 同 步 方 式 还 是 异 步 方 式 , 当 指 定 为 coConnectUnspecified 表示由数据库服务器决定,coAsyncConnect 表示异步方式,通常只有速度比 较慢的数据库系统才需要指定这种方式。如,下面的代码把 TADOConnection1 的连接方式设定为异 步方式。 ADOConnection1->Close(); ADOConnection1->ConnectOptions = coAsyncConnect; //异步连接方式 ADOConnection1->Open(); 注意,设置这个属性前需要把连接关闭,否则设置不起作用。 (2)ConnectionTimeOut 属性设定连接的超时上限,如果超过这个时间还没连接成功,则放弃 连接。时间的单位是秒。 有另一个相似的属性,CommandTimeout,这个属性指定发出一个 SQL 命令到数据库系统后, 多少时间内得不到结果就算失败,这个属性的单位同样是秒。 (3)可以通过 CommandCount 和 Commands 属性控制连接到这个 TADOConnection 的命令组件。 下面的代码执行所有连接到这个 TADOConnection 的 TADOCommand 的 SQL 语句。 for (int i = 0; i < ADOConnection1->CommandCount; i++) { ADOConnection1->Commands[i]->Execute(); //执行 Command } (4)对数据集,如 TADODataSet、TADOQuery 等。也可以用类似的方法控制。如下面的代码, 显示所有连接到这个 TADOConnection 的数据集的名称。 for (int i = 0; i < ADOConnection1->DataSetCount; i++) { ShowMessage(ADOConnection1->DataSets[i]->Name); } (5)KeepConnection 属性决定 TADOConnection 组件在没有任何数据集在使用的情况下是否保 持连接状态。如果这个属性设为 true,当程序中没有数据集使用时可以是否联机所占用的资源,但 下次重新激活数据集时需要时间建立连接。 ※ 4 ※ ( 6 ) Provider 属 性 表 明 了 这 个 连 接 的 提 供 者 , 刚 才 建 立 的 连 接 的 提 供 者 是 “Microsoft.Jet.OLEDB.4.0”。 (7)Mode 属性表明了这个连接的读写限制,它的取值如表 3 所示。 表 3 TADOConnection 的 Mode 属性 取值 含义 cmUnknown 未知类型 cmRead 只能从数据库读出,不能写入 cmWrite 只能写入数据库,不能读出 cmReadWrite 既可读,也可写 cmShareDenyRead 不允许其他连接到同一数据库的连接读数据库 cmShareDenyWrite 不允许其他连接到同一数据库的连接写入数据库 cmShareExclusive 不允许其他连接到同一数据库的连接打开数据库 cmShareDenyNone 完全共享 1.2 使用 TADOCOnnection组件获得数据库信息 利用 TADOConnection 组件,可以知道数据库中有什么表,表中有什么字段。要做到这些功能, 必须先连接到数据库,并激活连接,具体的方法见上一小节。 (1)获得数据库中的表名。 利用 TADOConnection 组件的 GetTableNames 方法,可以获得数据库中的表名,如下面的代码 所示: TStrings* tables = new TStringList; ADOConnection1->GetTableNames(tables,false); Memo1->Lines = tables; 代码中 GetTableNames 方法把所有存在于这个数据库的表名存放到 tables 中,并在 Memo1 组件 中显示出来。false 参数表示不把数据库中的系统表存入 tables 中,系统表是数据库系统用来记录信 息的表,并不是用户建立的表。 (2)取得表的字段名,利用 GetFieldNames 方法可以获得数据库中指定表的字段列表,如下面 的代码,把 employee 表的字段名写入到一个 Memo 组件中。 TStrings* fields = new TStringList; ADOConnection1->GetTableNames(“employee”,fields); Memo1->Lines = tables; (3)取得储存过程名, GetProcedureNames 方法可以取得储存过程的名字。下面的代码取出数 据库的所有储存过程名字,并试图执行: TStrings* storeds = new TStringList; ADOConnection1->GetProcedureNames(storeds); for(int i=0;iCount;i++) { AnsiString storedname = storeds[i]; //取得储存过程名字 ADOStoredProc1->ProcedureName = storedname; ADOStoredProc1->Execute(); } TADOStoredProc 是下面要介绍的 ADO 组件,专门用于执行储存过程。 1.3 综合应用 下面,做一个综合了以上两小节知识的程序,这个程序可以打开已经存在的 Access 数据库,并 查看内部有什么储存过程,有什么表,表内有什么字段。做的这个程序,TADOConnect 的连接并不 是在设计时指定的,它可以在运行时由用户打开指定的数据库文件。建立步骤如下: ※ 5 ※ (1)新建一个程序,加入一个 TADOConnection,一个 OpenDialog,三个 ListBox。作用如表 4 所示。 表 4 组件说明 组件 类型 作用 conMDB TADOConnection 建立到数据库的连接从数据库中取出表名,取出字 段名和储存过程名 OpenDialog1 OpenDialog 负责显示打开文件的对话框 listTables ListBox 负责显示数据库中的表 listFields ListBox 当点击了一个表时,这个表的字段名列表显示在个 列表框中 ListProc ListBox 负责显示储存过程 (2)如果在 Windows 2000 下建立这个程序,建议把窗体的字体设为宋体,字符集设为 CHINESE_GB2321。因为使用默认的字体设计出来的程序在 Windows 98 下面运行时可能出现错乱 这个程序的运行效果如图 5 所示。 图 5 TADOConnection 的综合应用 【程序清单 1:ADOConnection 综合应用例子】 //------------------------------------------------------------------ //TADOConnection 综合应用例子 // void __fastcall TForm1::btnOpenClick(TObject *Sender) { if(OpenDialog1->Execute()) { //判断 ADOConnection 是否不是处于关闭状态 if(!conMDB->State.Contains(stClosed)) { conMDB->Close();//关闭 Connection } //设定连接字符串 AnsiString MDBName = OpenDialog1->FileName; ※ 6 ※ conMDB->ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+MDBName; //打开连接 conMDB->Open(); //取得表名 conMDB->GetTableNames(listTables->Items,false); //取得储存过程名 conMDB->GetProcedureNames(listProc->Items); editDatabase->Text = OpenDialog1->FileName; } } //------------------------------------------------------------------ void __fastcall TForm1::listTablesClick(TObject *Sender) { //点击表名时,显示这个表的字段列表 AnsiString TableName = listTables->Items->Strings[listTables->ItemIndex]; conMDB->GetFieldNames(TableName,listFields->Items); } //------------------------------------------------------------------ 2 使用 ADO数据集 数据集就是指可以向 DataSource 提供数据的组件,如 BDE 组件中的 Table 和 Query。ADO 组 件中也有几个数据集组件,C++ Builder 为了统一编程方法和编程结构,把 ADO 组件的使用方式设 计成和 BDE 一样。 2.1 使用 TADODataSet 组件 TADODataSet 组件可以存取数据库表的内容,通过 SQL 命令方式或者指定表的方式获得数据库 内容。TADODataSet 组件的图标如图 6 所示。 图 6 TADODataSet 组件 可以通过设定 TADODataSet 的 ConnectionString 属性获得数据库连接,也可以把 Connection 属 性指向一个已经存在的 TADOConnection 组件来获得数据库连接。TADOConnection 的使用方法见 1 节。 使用 TADODataSet 组件浏览记录,修改记录和其他的数据集是一样的。 TADODataSet 组件可以从单一的表中获取数据,此时应该把 CommandType 属性设为 cmdTable, 并把 CommandText 属性设为表名。如下面的代码所示: ADODataSet1->CommandType = cmdTable; ADODataSet1->CommandText = "CustomerTable"; ADODataSet1->Open(); 如果需要执行 SQL 命令,应该把 CommandType 的属性设为 cmdText,并把 CommandText 属性 设为 SQL 语句。如,可用下面的代码获得和上面那段代码一样的效果。 ADODataSet1->CommandType = cmdText; ※ 7 ※ ADODataSet1->CommandText = "SELECT * FROM CustomerTable"; ADODataSet1->Open(); 如果不确定 CommandText 的内容到底是一个表名还是一条 SQL 语句,可以把 CommandType 属性设为 cmdUnknown,这将会使 TADODataSet 组件自己判断。 可以通过 TADODataSet 的 GetIndexNames 方法获得数据库中的索引。如下面的代码: TStrings* indexs = new TStringList; ADODataSet1->GetIndexNames(indexs); Memo1->Lines = indexs; 上面的代码把数据库中所有的索引的名称放在一个 Memo 组件中显示。 ADODataSet 组件和其他的 ADO 数据集组件(TADOQuery,TADOCommand)在功能上有很大 部分的重叠,因为它们都继承自 TCustomADODataSet。下面,用 TADODataSet 为蓝本,介绍 TCustomADODataSet 的属性和方法。这些属性和方法在其他 ADO 数据集中同样通用。 (1)CanModify 属性表明了这个数据集代表的数据能否被修改。如下面的代码,如果数据能被 修改,TADODataSet1 组件进入编辑状态。 if ADODataSet1->CanModify then { ADODataSet1->Edit(); } else { ShowMessage("数据不能被修改!"); } (2)CursorLocation 属性说明了游标在客户段还是服务器段,它可以取 clUseServer(在服务器 段)、clUseClient(在客户端)。当把游标放在客户端时,所有的数据集都会抓取到客户端中,这样 存取的速度会很快,但不能用于数据量大的情况。 (3)CursorType 指明了游标的类型,它的取值如表 5 所示。 表 5 CursorType 的取值 取值 含义 ctUnspecified 没有指定游标类型 ctOpenForwardOnly 游标只能向后移动,这样的游标速度比较快 ctKeyset 不能识别由其他连接增加的记录 ctDynamic 游标可以向前或向后移动,也可以识别另外连接对这个表的改动 ctStatic 静态游标,不能识别另外的连接所作的改动 (4)RecNo 和 RecordCount 属性分别标示出当前记录的位置和记录的数目。如下面的代码所示: ADODataSet1->Open(); int RecNo = ADODataSet1->RecNo; int RecCount = ADODataSet1->RecordCount; ShowMessage("这个记录集有"+IntToStr(RecCount)+"条记录,当前记录是第"+IntToStr(RecNo)+" 条"); 要读取这些值,必须先激活数据集。 (5)Sort 属性指定如何为数据集中的记录排序,如下面的代码所示: ADODataSet1->CommandType = cmdTable; //CommandText 为 Table 类型 ADODataSet1->CommandText = "employee"; ADODataSet1->Sort = "FirstName ASC,HireDate DESC"; ADODataSet1->Open(); 上面的代码表示要求安装 FirstName 从小到大排列,如果 FirstName 相同,则按照 HireData 从 ※ 8 ※ 大到小排列。 (6)SaveToFile 和 LoadFromFile 方法可以把 ADO 数据集的内容保存到文件中,或者从文件中 读出记录集的内容。如下面的代码所示: ADODataSet1->SaveToFile("C:\\RS.XML",pfXML); . . . ADODataSet1->LoadFromFile("C:\\RS.XML"); 在调用 SaveToFile 时,ADO 数据集会自动关闭连接。 (7)Supports 方法可以查询当前的记录是否支持某种操作,参数是一个 TCursorOptions 类型的 数据,可取的值如表 6 所示。 表 6 Supports 的参数 取值 含义 coHoldRecords 可以从数据库中取得更多的数据 coMovePrevious 游标可以向前移动 coAddNew 可以在数据集中增加数据 coDelete 可以删除记录 coUpdate 数据可以被修改 coBookmark 可以利用 关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf 签移动到指定记录 coApproxPosition 可以利用数据集的 RecNo 属性确定当前记录位置 coUpdateBatch 可以使用 Batch 方式修改数据库 coResync 数据库中的记录可以用 Resync 方法修改 coNotify 支持数据库通过事件方式 通知 关于发布提成方案的通知关于xx通知关于成立公司筹建组的通知关于红头文件的使用公开通知关于计发全勤奖的通知 数据集 coFind 可以使用 Locate 方法查找数据 coSeek 可以使用 Seek 方法查找数据 coIndex 可以使用 IndexName 属性指定索引 如,下面的代码在插入记录前检查数据集是否允许这个操作。 TCursorOptions co; co<Supports(co)) { ADODataSet1->Insert(); } (8)可以用 ADO 数据集的 Seek 方法查找数据集中符合条件的记录,要使用 Seek 方法,必须 为表设定索引,并且把数据集的 IndexName 属性设为这个索引。在使用 TADODataSet 组件时, CommandType 设为 cmdTableDirect,使用 TADOTable 时把 TableDirect 属性设为 true。CursroLocation 属性设为 clUseServer,CursorType 属性设为 ctKeySet。准备好这些工作后,就可以开始使用 Seek 方法了。如下面的代码所示: ADODataSet1->CursorType = ctKeyset; //游标类型是 KeySet ADODataSet1->CursorLocation = clUseServer; //游标在服务器端 ADODataSet1->CommandType = cmdTableDirect; //直接操控 Table ADODataSet1->CommandText = "abc"; ADODataSet1->IndexName = "PrimaryKey"; //取主键做索引 ADODataSet1->Open(); ADODataSet1->Seek("3",soAfter); ShowMessage(ADODataSet1->FieldByName("a")->AsString); ※ 9 ※ 要执行上面的代码,需要自己建立数据库,并设置 TADODataSet 组件的 ConnectionString 打开 这个数据库。 上面的代码表示在 abc 表的 PrimaryKey 索引字段上查找“3”,soAfter 是一个指定如何定位游 标的参数。它的取值如表 7 所示。 表 7 Seek 方法的参数 取值 含义 soFirstEQ 定位在第一个符合条件的记录处,如果没有记录符合,定位在最后 soLastEQ 定位在最后一个符合记录处 soAfterEQ 如果有符合条件的记录,定位在记录处,如果没有符合的记录,按 照索引,定位在应该出现的位置的后面 soAfter 定位在应该出现的位置的后面,不论是否有符合条件的记录 soBeforeEQ 如果有符合条件的记录,定位在记录处,如果没有定位在应该出现 的位置的前面 soBefore 定位在应该出现的位置的前面,无论是否有符合条件的记录 如果索引是建立在多个字段上的,查找可以同时指定多个字段的值,如下面的代码所示。 ADODataSet1->Seek(VarArrayOf(OPENARRAY(Variant, (90030, 90020))), soFirstEQ); 但要注意的是,假设为用第一、第二和第三个字段建立了一个索引,那么可以指定第一和第二 个字段、第二和第三个字段进行搜索,但不能指定第一和第三个字段进行搜索。 2.2 使用 TADOQuery 组件 TADOQuery 组件专门用于执行 SQL 语言,可以执行数据维护语言(DML),如 SELECT 语句, 也可以执行数据定义语言(DDL),如 CREATE TABLE 语句。TADOQuery 中包含的 SQL 语句必须 是当前驱动程序可以理解的,因为很多数据库驱动程序对 SQL 语言的规定标准有所不同。 TADOQuery 组件的图标如图 7 所示。 图 7 TADOQuery 组件 TADOQuery 组件可以通过本身的 ConnectionString 属性获得到数据库的连接,也可以通过把 Connection 属性设为一个 TADOConnection 组件来获得连接。下面介绍 TADOQuery 组件的各项功能。 (1)要执行 SQL 语句,在运行时可以单击 SQL 属性的带省略号的按钮,打开属性编辑器。在 改属性编辑器中,为 Query 组件输入 SQL 语句。当然,也可以在运行时为它输入 SQL 语句,不过 要先关闭数据集。如下面的代码所示: ADOQuery1->Close(); ADOQuery1->SQL->Clear(); ADOQuery1->SQL->Add("SELECT EmpNo, LastName, FirstName, HireDate"); ADOQuery1->SQL->Add("FROM Employee"); ADOQuery1->Open(); 利用 TADOQuery 组件执行 SQL 语句有两种方式,这两种方式是由 SQL 语句的类型决定的,如 果 SQL 语句返回记录集,应该用 Open 方法执行,或者设定 Active 属性为 true。通常,只有 SELECT 语句返回记录集,因此,所有 SELECT 语句的执行都通过 Open 方法来实现。如下面的代码所示: ADOQuery1->SQL->Clear(); ADOQuery1->SQL->Add("SELECT * FROM EMPLOYEE"); ADOQuery1->Open(); 如果需要在设计是激活数据集,可以在对象观察器中把它的 Active 属性设为 true。 ※ 10 ※ 如果 SQL 语句不会返回记录集,应该用 ExecSQL 方法执行,如下面的代码: ADOQuery1->SQL->Clear(); ADOQuery1->SQL->Add("DELETE * FROM EMPLOYEE WHERE FirstName='Lee'"); ADOQuery1->ExecSQL(); C++ Builder 提供了 TADOCommand 组件专门执行这种没有返回记录集的 SQL 语句。 (2)在 TADOQuery 中的 SQL 语句可以包含参数,就像 Query 组件一样。TADOQuery 提供了 一个 DataSource 属性用于从其他数据集中获得这些参数的值。在执行这种 SQL 语句时,TADOQuery 组件会自动到 DataSource 属性指定的 DataSource 中查找和参数名一样的字段,并把它们的值应用到 本 SQL 语句中。假设有一个 TADOQuery 组件的 DataSource 属性指向了一个和客户表连接的 DataSource,客户表中有一个 CustNo 字段,可以这样编写程序: ADOQuery1->SQL->Clear(); ADOQuery1->SQL->Add("SELECT * FROM Orders O WHERE (O.CustNo = :CustNo)"); ADOQuery1->DataSource = DataSource1; TADOQuery 的 DataSource 属性必须指向另一个数据集,不能回指这个 TADOQuery 本身。而且 在使用这个功能前,那个数据集必须已经打开并准备好。在执行这种 SQL 语句前,应该先绑定参数 值,通过把 TADOQuery 组件的 Prepare 属性设为 true 绑定参数。如下面的代码所示: ADOQuery2->DataSource = DataSource1; ADOQuery2->Prepared = true; ADOQuery2->Open(); 如果 SQL 语句使用的是 SELECT 语句,那么当 DataSource 指定的数据集的指针移动时,这个 TADOQuery 组件会自动应用新值作为 SQL 语句的参数,并不需要都用 Open 方法。 如果 SQL 语句不是 SELECT 语句,如 INSERT 或者 UPDATE,在 DataSource 指定的数据集的 指针移动后,必须明确地重新执行本 SQL 语句。 假设有下面的 SQL 语句: INSERT INTO Customer (CustNo, Company) VALUES (:CustNo, :CompanyName) 这里有两个参数,CustNo 和 CompanyName,如果 DataSource 指定的数据集中有 CustNo 字段, 但是没有 CompanyName 字段。那么可以采取两种给参数赋值的方式,CompanyName 用代码方式赋 值,CustNo 用 DataSource 方式赋值,如下面的代码所示: ADOQuery2->DataSource = DataSource1; ADOQuery2->ParamByName("CompanyName")->AsString = Edit1->Text; ADOQuery2->Prepared = true; ADOQuery2->ExecSQL(); 下面,举一个综合例子,示范如何利用 ADO 组件访问 Paradox 数据库,并示范如何使用 TADOQuery 组件的 DataSource 属性。 在介绍 BDE 时,经常使用 Paradox 数据库,这些数据库在安装 C++ Builder 时被储存在 C++ Builder 的目录中。为了在 ADO 数据库中调用 Paradox,为 Paradox 数据库建立一个 ODBC 数据源。 为 Paradox 数据库建立 ODBC 数据源。 在 Windows 2000 环境下,可以选择【控制面板】|【管理工具】|【数据源(ODBC)】进入设置 ODBC 数据源的对话框。在 Windows 98 环境下,这个工具被放在【控制面板】中。进入数据源设 置对话框后,出现如图 8 所示的对话框。 DSN 是数据源的意思,记录了特定数据库的信息,可以通过数据源打开数据库。【用户 DSN】 表示当前 Widnows 用户可以用到的数据源,【系统 DSN】表示所有用户都可用的数据源。 单击【添加】按钮,出现如图 9 所示的对话框。 这个对话框中列出了支持 ODBC 接口的驱动程序,选择 Microsoft Paradox Driver(*.db)。单击【完 ※ 11 ※ 成】按钮,出现如图 10 所示对话框。 图 8 设定数据源 图 9 选择数据库驱动程序 图 10 生成数据源 在【数据源名】中输入“MyParadox”,将通过数据源名连接到数据库中。单击【选择目录】, 打开一个对话框,选择 C++ Builder 安装目录下的“Borland Shared\Data”目录。Paradox 数据库不 像 Access 数据库那样把数据库放在一个文件中,Paradox 把同一数据库的所有表放在一个目录中。 单击【确定】按钮,这样就生成一个名为“MyParadox”的数据源了。 下面建立一个调用客户表和定单表的程序。建立步骤如下: ① 新建一个程序,加入一个 TADOQuery 组件。编辑它的 ConnectionString 属性,选择 Microsoft OLE DB Provider for ODBC Drivers,这个驱动程序负责 ODBC 到 OLE DB 的接口,而 ADO 使用的 是 OLE DB 规范。选择驱动程序后选择刚才建立的 MyParadox 数据源。选择,可以从 ADO 数据集 组件中访问 Paradox 数据库了。 ② 加入两个 DataSource 组件和两个 DBGrid 组件,把 DataSource1 的 DataSet 属性设为 ADOTable1,DataSource2 的 DataSet 属性设为 TADOQuery1。DBGrid1 放在 DBGrid2 上面,把 DBGrid1 的 DataSource 属性设为 DataSource1,DBGrid2 的 DataSource 属性设为 DataSource2。 ③ 把 ADOQuery1 组件的 SQL 属性设为“Select * from Orders o where o.CustNo=: CustNo”,把 DataSource 属性设为 DataSource1,设定 Parameters 属性中的 CustNo 参数设为整型。 ④ 把 ADOTable1 的 Active 属性设 true,ADOQuery1 的 Active 属性设为 true,在窗体上立刻就 可以看到效果。 ⑤ 运行这个程序,运行效果如图 11 所示,在上面的表中移动指针,下面的表立刻显示出这个 客户所定的定单。 (3)可以利用 RowsAffected 属性判断出上一次 SQL 命令执行后有多少条记录被改动过。这个 属性用于向用户显示信息十分有用,如下面的代码: ADOQuery1->SQL->Clear(); ADOQuery1->SQL->Add( "update employee set salary=salary*1.2 where HireDate>'12/25/1980'"); //加入 SQL 语句 ADOQuery1->ExecSQL(); ※ 12 ※ int Updated = ADOQuery1->RowsAffected; ShowMessage("有"+IntToStr(Updated)+"个职员被提资"); 图 11 利用 TADOQuery 组件调用 Paradox 数据库 2.3 使用 TADOCommand 组件 TADOCommand 组件专门用于执行没有记录集返回的 SQL 语句。TADOCommand 组件的图标如 图 12 所示。 图 12 TADOCommand 组件 TADOCommand 组件也可以执行会返回记录集的 SQL 语句,但一般只用作执行没有返回记录集 的 SQL 语句,如数据定义语言(DDL)。 和其他的 ADO 数据集一样,TADOCommand 组件可以通过设置 ConnectionString 获得连接,也 可以把它的 Connection 属性指向一个 TADOConnection 组件以获得连接。 和 TADODataSet 组件一样,可以在 TADOCommand 组件的 CommandText 属性中设置 SQL 语句, 然后在 CommandType 中设置语句的类型。 CommandType 的取值如表 8 所示。 表 8 CommandType 的取值 取值 含义 cmdUnknown 未知类型,由组件自己探测 CmdText 是一条 SQL 语句 cmdTable 是一个表名 cmdStoredProc 是一个储存过程 CmdFile 是一个保存数据集的文件名 cmdTableDirect 是一个表名,取回所有的字段值 设定 CommandText 和 CommandType 后,可以调用 Execute 方法执行 SQL 语句,如下面的语句: ADOCommand1->CommandText = "Delete from employee where FirstName='Lee'"; ADOCommand1->CommandType = cmdText; ADOCommand1->Execute(); ExecuteOptions 属性设置命令的执行方式,可以由如表 9 所示的值组成。 ※ 13 ※ 表 9 ExecuteOptions 的取值 取值 含义 eoAsyncExecute 命令用异步方式执行 eoAsyncFetch 异步方式取回记录 eoAsyncFetchNonBlocking 在不阻塞线程的方式下取回数据集 cmdStoredProc 是一个储存过程 eoExecuteNoRecords 不返回记录集 在命令的执行过程中,可以用 Cancel 方法取消命令的执行,Cancel 方法只能在一条命令还没有 最后被执行,而且该命令是异步执行的情况下发挥作用。 没有被最后执行的定义是 Execute 方法已经被调用,但命令还没有完成和超时,如果一条命令 在 CommandTimeout 属性中指定的秒数还没有被取消或完成,该命令超时。 如下面的代码所示: void __fastcall TForm1::Button1Click(TObject *Sender) { ADOCommand1->CommandText = "Delete from employee where FirstName='Lee'"; ADOCommand1->CommandType = cmdText; //CommandText 的类型是 SQL 语句 ADOCommand1->Execute(); } //------------------------------------------------------------------ void __fastcall TForm1::Button2Click(TObject *Sender) { ADOCommand1->Cancel(); } 在上面的代码中,Button1 的单击事件执行 ADOCommand1 的 SQL 命令,如果在 ADOCommand1 的命令没有被最后执行完成之前单击 Button2,这个命令的执行便被取消。 TADOCommand 也可以执行有记录集返回的 SQL 语句,但需要把返回的记录集转换给另一个可 以接收记录集的数据集,下面的代码演示了如何实现这个功能。 ADOCommand1->CommandText = "Select * from employee"; ADOCommand1->CommandType = cmdText; ADODataSet1->Recordset = ADOCommand1->Execute(); 在上面的代码中,把由 ADOCommand1 的 Execute 方法返回的 RecordSet 赋值给 ADODataSet1 的 RecordSet 属性。 这样,ADOCommand1 返回的记录集就转送到 ADODataSet1 中,可以用 ADODataSet1 访问这 些记录。 2.4 使用 TADOTable 组件 TADOTable 组件专门用于访问数据库中的一个表,它的图标如图 13 所示。 图 13 TADOTable 组件 使用 TADOTable 组件之前,需要获得到数据库的连接。可以设置 ConnectionString 获得连接, 或者设置 Connection 属性。 ※ 14 ※ 通过设定 TableName 属性指定 TADOTable 连接的表。使用 TADOTable 组件,可以浏览、删除、 编辑数据。可以在运行时通过对象观察器设置 TADOTable 的 TabeName 属性,或者通过代码设置其 TableName 属性。如: ADOTable1->TableName = "Employee"; ReadOnly 属性说明这个表是不是只读的,只读的表不可以向表写入或修改其中的内容。 TableDirect 属性指定是否直接操作表,在 true 的状态下表的所有内容被送回客户端。在 false 状态下,在 TADOTable 组件内部,表的操作会通过 SQL 命令实现。如果需要的整张表格,把这个 参数设为 ture 可以提供运作速度。 GetIndexNames 方法可以取得这个表的所有索引。下面给出一个程序例子,这个程序可以代开 任意的 Access 数据库并显示指定表的索引。这个程序的运行效果如图 14 所示。 图 14 取出表的索引 建立步骤: 新建一个程序,加入两个 ListBox,一个 TADOConnection、一个 TADOTable 组件,把 ADOTable1 的 Connection 属性设为 ADOConnection1。具体的实现见程序清单 2。 【程序清单 2:用 ADOTable 组件提取索引名】 //------------------------------------------------------------------ //利用 ADOTable 组件提取索引名 // void __fastcall TForm1::Button1Click(TObject *Sender) { //当选择“打开 Access 数据库”时调用这个函数 if(!ADOConnection1->State.Contains(stClosed)) { //如果原来处于打开状态,关闭这个 Connection ADOConnection1->Close(); } if(OpenDialog1->Execute()) { //打开连接到指定数据库 ADOConnection1->ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source="+OpenDialog1->FileName; ADOConnection1->Connected = true; ADOConnection1->GetTableNames(ListBox1->Items); } } //-------------------------------------------
本文档为【C++_Builder的ADO组件】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_227243
暂无简介~
格式:pdf
大小:276KB
软件:PDF阅读器
页数:16
分类:互联网
上传时间:2011-11-02
浏览量:101