BCB讲座第十四讲数据库编程基础
- 格式:doc
- 大小:91.50 KB
- 文档页数:5
第一部分:基础入门1.窗体1)问:Windows的编程就是在窗体的基础上实现的,C++Builder是怎样处理窗体的呢?答:窗体的一部分功能通过窗体的属性来实现,窗体的属性非常多,这里只对其中比较重要的属性进行介绍。
1.ActiveControl指定窗体上的某个组件为输入焦点。
如下面的语句将窗体上的Label1组件成为输入焦点:ActiveControl=Label1。
在同一时时刻,应用程序只能有一个输入焦点。
2.BorderIcons用来设定标题栏上出现哪些系统图标。
它是一个集合,可以设成以下几个类型:最大化按钮(biMaximize)、最小化按钮(biMinimize)、帮助按钮(biHelp)和系统菜单(biSystemMenu)。
3.Icon属性用来指定当窗体最小化时显示的图标。
4.KeyPreview属性为true时,表示击键事件发生时先传给窗体,然后再传给有输入焦点的组件上,相当于窗体截获了原本属于组件的事件。
缺省值为false,表示击键事件只送到当前有输入焦点的组件上。
5.Menu属性用来指定窗体的主菜单。
6.Visible属性用来确定窗体是否可见。
此外还有一些运行时态属性,这些属性只有在程序运行的时候才能通过编程访问。
这种属性主要有:Active属性用来确定窗体是否获得输入焦点。
ActiveMDIChild这个函数将返回当前活动的子窗体。
DropTarget属性用来指定窗体是否是拖放操作的对象。
Parent属性用来设定包含窗体的窗口控件,通常是另一个窗体。
如果窗体没有包含它的控件,那么它的Parent属性为nil。
2)问:Windows窗体有很多样式,比如对话框,弹出窗口。
如果我要控制窗体的边界样式,应该怎么办?答:属性BorderStyle可以指定窗体边界的外观和行为。
它一共有六种可能的取值。
bsDialog表示大小不可变的标准的对话框边界。
bsSingle表示大小不可变的单线边界。
简单数据库编辑操作上一讲我们学习了利用Query1控件和SQL语句实现简单数据库查询的方法,在本讲中,我们将要学习如何利用Table1控件来实现添加、修改、删除记录等数据库编辑操作。
获取当前记录在上一讲中我们曾经比较过Query控件和Table控件的异同,并指出Query控件是通过SQL语句来操作数据库的,SQL语句除了可以实现查询外,也可以通过关键字INSERT、UPDATE、DELETE 来实现添加、修改和删除记录的操作,但是这一类SQL语句对初学者来说有一定难度,而Table控件提供有Insert、Edit、Delete等方法,实现简单的数据库编辑操作比Query控件更为容易,因此心铃决定以Table控件为例来介绍进行数据库编辑操作的方法。
MP3Collect使用的Query1和Table1是两个独立的控件,用户看到窗体上的数据是由Query1提供的,怎样才能让Table1控件知道用户当前操作的是哪一条记录呢?为了解决这个问题,我们需要先学习一些基础知识。
数据集控件(Table或Query)除了提供一组记录集合之外,还保存了一个称为光标(Cursor)的指针,用于指向当前记录,程序可以通过调用TDataSet类的First()、Next()、Prior()、MoveBy()、Last()等方法控制记录光标的移动。
如果数据集控件与某个数据控制控件相关联,则还可以通过数据控制控件来移动记录光标,例如,MP3Collect主窗体上的Query1控件和DBGrid1控件建立了关联(通过DataSource1控件),当用户在DBGrid1中选择不同的行时,同时也会把Query1的记录光标移到相应的位置上。
无论用哪种方式改变了数据集控件的当前记录光标,都会触发数据集控件的AfterScroll事件。
因此,我们要为Query1控件添加AfterScroll事件的处理函数Query1AfterScroll,在其中获取当前记录的内容并显示在三个编辑框中,同时在MediaPlayer1中打开相应的音乐文件,另外还要利用Table 控件的FindKey()方法将Table1的记录光标调整到相同的记录上。
C++文件操作之三 : BCB提供的文件操作的库函数在BCB中也提供了文件操作的函数,这些函数的功能和前面所介绍的大致相同,但这类函数和BCB关系紧密,能使用BCB中的AnsiString等数据类型,在BCB中用这种方式的文件操作是最方便的,下面我就把这种文件操作详细介绍。
在BCB提供的这组文件操作函数中,可分为三种类型,就是:1、文件名函数,2、文件管理函数;3、文件I/O函数。
1、文件名函数文件名函数可以对文件的名称、所在子目录、驱动器和扩展名等进行操作。
下表列出这些函数及其功能。
函数说明:ExpandFileName() 返回文件的全路径(含驱动器、路径)ExtractFileExt() 从文件名中抽取扩展名ExtractFileName() 从文件名中抽取不含路径的文件名ExtractFilePath() 从文件名中抽取路径名ExtractFileDir() 从文件名中抽取目录名ExtractFileDrive() 从文件名中抽取驱动器名ChangeFileExt() 改变文件的扩展名ExpandUNCFileName() 返回含有网络驱动器的文件全路径ExtractRelativePath() 从文件名中抽取相对路径信息ExtractShortPathName() 把文件名转化为DOS的8·3格式MatchesMask() 检查文件是否与指定的文件名格式匹配下面就把这些函数作一一介绍:⑴ExpandFileName()原型:extern PACKAGE AnsiString __fastcall ExpandFileName(const AnsiString FileName);功能:返回文件的全路径(含驱动器、路径)参数:FileName:要处理的文件名例:ShowMessage(ExpandFileName(Application->ExeName));//显示你的程序文件名,如C:\MyBCB\Sample1.EXE⑵ExtractFileExt()原型:extern PACKAGE AnsiString __fastcall ExtractFileExt(const AnsiString FileName);功能:从文件名中抽取扩展名参数:FileName:要处理的文件名(全路径)例:ShowMessage(ExtractFileExt(Application->ExeName));//显示".exe"⑶ExtractFileName()原型:extern PACKAGE AnsiString __fastcall ExtractFileName(const AnsiString FileName);功能:从文件名中抽取不含路径的文件名参数:FileName:要处理的文件名例:ShowMessage(ExtractFileExt("c:\\Winnt\\SOL.EXE"));//显示"SOL.EXE"⑷ExtractFilePath()原型:extern PACKAGE AnsiString __fastcall ExtractFilePath(const AnsiString FileName);功能:从文件名中抽取路径名参数:FileName:要处理的文件名例:ShowMessage(ExtractFilePath("Winnt\\SOL.EXE"));//显示"Winnt\"⑸ExtractFileDir()原型:extern PACKAGE AnsiString __fastcall ExtractFileDir(const AnsiString FileName);功能:从文件名中抽取目录名(和上个函数不同,不包括最后的"\")参数:FileName:要处理的文件名例:ShowMessage(ExtractFileDir("Winnt\\SOL.EXE"));//显示"Winnt",注意和上个函数的区别⑹ExtractFileDrive()原型:extern PACKAGE AnsiString __fastcall ExtractFileDrive(const AnsiString FileName);功能:从文件名中抽取驱动器名参数:FileName:要处理的文件名例:ShowMessage(ExtractFileDrive("c:\\Winnt\\SOL.EXE"));//显示"c:"⑺ChangeFileExt()原型:extern PACKAGE System::AnsiString __fastcall ChangeFileExt(const System::AnsiString FileName, const System::AnsiString Extension);功能:更改文件名的扩展名,不是对真正的文件进行改名,只是对文件名这个字符串进行处理参数:FileName:要改名的文件名,Extension:新的扩展名例:ShowMessage(ChangeFileExt("c:\\Winnt\\SOL.EXE",".OOO"));//显示"c:\winnt\SOL.OOO"⑻ExpandUNCFileName()原型:extern PACKAGE AnsiString __fastcall ExpandUNCFileName(const AnsiString FileName); 功能:返回含有网络驱动器的文件全路径,格式为:\\机器名\共享名\文件名参数:FileName:要处理的文件名例:ShowMessage(ExpandUNCFileName("F:\\Winnt\\SOL.EXE"));/*如果F:是映射的网络驱动器\\NT40\WINNT,则显示"\\NT40\WINNT\SOL.EXE"*/⑼ExtractRelativePath()原型:extern PACKAGE AnsiString __fastcall ExtractRelativePath(const AnsiString BaseName, const AnsiString DestName);功能:从文件名中抽取相对路径信息,如"..\sss\ss.asd"这种形式参数:BaseName:基准文件名;DestName:目标文件名例:ShowMessage(ExtractRelativePath("D:\\Source\\c\\1.123","D:\\Source\\Asm\\dz.asm"));/*显示"..\asm\dz.asm"*/⑽ExtractShortPathName()原型:extern PACKAGE AnsiString __fastcall ExtractShortPathName(const AnsiString FileName);功能:把文件名转换为DOS的8、3格式参数:FileName:要处理的文件名例:ShowMessage(ExtractShortPathName("E:\\Program Files\\Dual WheelMouse\\4dmain.exe"));/*显示"E:\Progra~1\dualwh~1\4dmain.exe"*/⑾MatchesMask()原型:extern PACKAGE bool __fastcall MatchesMask(const AnsiString Filename, const AnsiString Mask);功能:检查文件是否与指定的文件名格式匹配参数:FileName:要处理的文件名;Mask:文件名格式,支持通配符例:ShowMessage(MatchesMask("Lxf.exe","*.?x?));//显示"true"2、文件管理函数这类函数包括设置和读取驱动器、子目录和文件的有关的各种操作,下表列出这类操作常用的函数及其功能。
音频和视频信息加工13-1A B C B C作品的制作与发布16-3C C B A B作品的制作与发布16-1B C A B C程序设计语言基础(3-3)D C D B D计算机解决问题的过程(1-2)C D D D A程序设计语言基础(3-6)D A D D B程序设计语言基础(3-4)C C D A B程序设计语言基础(3-5)B D B D C选择结构(4-2-1)C B B A D选择结构(4-2-2)D A A A B选择结构(4-2-4)D D B B C选择结构(4-2-6)B D D A A基础(1-1)A C B信息的智能化加工7-2C B C D C信息的评价5-2A C D C A B 信息的智能化加工7-1C A C C B信息的评价5-3B A C C B表格数据的数值计算10-4A C D D A信息的评价5-5C D B C ACD信息的评价5-4A B A C D AC 表格数据的数值计算10-1B D D B B C 表格数据的数值计算10-3B B D C C表格数据的数值计算10-2A C D B A D 程序设计语言基础(3-1)C D A A B音频和视频信息加工13-2D B B B D信息的智能化加工7-3A D C B C信息的智能化加工7-4A D D BD ACE G 算法及其描述B C D A程序设计语言基础(3-1)C D A A B作品的制作与发布16-4B A B A B作品的制作与发布16-2C B A D A程序设计语言基础(3-2)A C B B C信息交流17-5A D C A计算机解决问题的过程(1-1)C C D C A多媒体及多媒体技术的概念和特征(1-B D B B B D 1)信息交流17-3A B C B信息交流17-4B A B A信息交流17-2BD D D D B信息交流17-1A B D A AC信息的获取-1B C B B B。
1.BCB通用函數庫// 获得计算机名AnsiString GetComputerName(){char name[MAX_COMPUTERNAME_LENGTH + 1];DWORD size = MAX_COMPUTERNAME_LENGTH + 1;if(GetComputerName(name,&size))return AnsiString(name);return "";}// 获得当前用户名AnsiString GetUserName(){char username[MAX_COMPUTERNAME_LENGTH + 1];DWORD size = MAX_COMPUTERNAME_LENGTH + 1;if(GetUserName(username,&size))return AnsiString(username);return "";}// Windows 文件夹AnsiString GetWindowsDir(){String path;path.SetLength(MAX_PATH);path.SetLength(GetWindowsDirectory(path.c_str(),path.Length())); return path;}// System 文件夹AnsiString GetSystemDir(){String path;path.SetLength(MAX_PATH);path.SetLength(GetSystemDirectory(path.c_str(),path.Length())); return path;}// Temp 文件夹AnsiString GetTempDir(){String path;path.SetLength(MAX_PATH);path.SetLength(GetTempPath(MAX_PATH,path.c_str()));return path;}// 当前文件夹AnsiString GetCurrDir(){String path;path.SetLength(MAX_PATH);path.SetLength(GetCurrentDirectory(MAX_PATH,path.c_str()));return path;// return ExtractFilePath(Application->ExeName);// return ExtractFilePath(ParamStr(0));}// 获得IE 版本AnsiString GetIEVersion(){AnsiString strReturn;LPCTSTR Data_Set = "SOFTWARE\\Microsoft\\Internet Explorer\\"; HKEY hKEY;long ret0 = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, // root keyData_Set, //要访问的键的位置; 0, //必须为0;KEY_READ, //以查询的方式访问注册表;&hKEY); //hKEY保存此函数所打开的键的句柄。
第15章数据库访问数据库的使用越来越广泛。
从个体业者到大型公司的人事系统,都需要使用数据库来保存和维护应用程序使用和处理的所有记录。
Visual C++提供了多种多样的数据库访问技术,包括ODBC、DAO、OLE DB、ADO等,这些技术各有自己的特点,它们提供了简单、灵活、访问速度快、可扩展性好的开发技术,本章将介绍这几种访问技术。
15.1 数据库介绍数据库顾名思义是存储和管理大量数据的地方,广义的数据就是现在常说的信息。
随着社会的进步,信息已经成为重要的资源,因此,数据库技术已经成为计算机技术非常重要的分支。
现在几乎所有大型的应用程序都是基于数据库的,所以用Visual C++6.0进行数据库编程已经成为MFC程序员的必备技能。
15.1.1 关系数据库系统提到数据库就不得不讲到数据库管理系统(DBMS)。
DBMS是用于描述、管理和维护数据库的程序系统,是数据库系统的核心组成部分。
它建立在操作系统的基础上,对数据库进行同意管理和控制。
其主要功能有:1)描述数据库。
描述数据库的逻辑结构、存储结构、语义信息和保密要求等。
2)管理数据库。
控制整个数据库系统的运行,控制用户的并发性访问,检验数据的安全、保密与完整性,执行数据检索、插入、删除和修改等操作。
3)维护数据库。
控制数据库初始数据的装入、记录工作日志,监视数据库性能,修改更新数据库,重新组织数据库,恢复出现故障的数据库。
4)数据通信。
组织数据的传输。
DBMS主要有3种类型:层次数据库系统、网状数据库系统和关系数据库系统。
其中最常用的当属关系数据库系统。
关系数据库是目前应用最为广泛的数据库系统,它提供了一种简单灵活的数据结构,采用关系模型来存储数据。
关系模型基于关系代数和关系理论,在早期,它们使用相同的术语来描述这种数据结构上的操作。
例如关系理论中使用“关系”表示表、“原组”表示行、“属性”表示表中的列。
关系模型包括数据结构,在这些数据结构上管理数据的操作和一些完整性规则,用来保证数据符合定义在系统中的业务规则。
数据库编程基础到上一讲为止,我们的音乐收藏小程序Mp3Collect的第一个版本已经完成了,这个版本的实现是基于文件的,具有简单的记录编辑和管理能力,但它也存在一些缺陷,因此在接下来的几讲中,我们就来编写Mp3Collect的第二个版本,第二版将利用数据库来保存记录,并具备访问查询数据库的能力。
由于数据库在讲座中是全新的内容,所以在动手编程之前,心铃首先介绍一下在CBuilder 中进行数据库编程的一些基础知识。
●什么是数据库通常我们在谈论数据库的时候,很容易把数据库(Database)、数据库管理系统(Database Management System)、和数据库应用程序(Database Application)混在一起,实际上,它们是构成数据库应用系统的三个组成部分,其中数据库是按照一定的结构组织在一起的相关数据的集合;数据库管理系统是建立、使用和管理数据库的软件系统,简称为DBMS;而数据库应用程序则是具有数据库访问能力的应用程序,它提供用户一个访问和操作特定数据库的用户界面。
举例来说,我们常用的Office办公套件中有一个Access软件,它就是一种数据库管理系统,如果利用Access创建一个MP3Collect.mdb文件用于保存MP3音乐信息,那么这个MP3Collect.mdb文件就是一个数据库,而将要编写的第二版MP3Collect.exe能够访问MP3Collect.mdb中保存的记录信息,因此它是一个数据库应用程序。
数据库和数据库管理系统是密切相关的,通常我们称某某数据库是某一类型的数据库,就是按照该数据库管理系统的名称来命名的。
例如,MP3Collect.mdb可以称为一个Access数据库。
数据库管理系统不仅可以直接访问某一类型的数据库,还可以提供给其它应用程序一个访问该类型数据库的引擎(即驱动程序),这样,应用程序在访问数据库时就不用考虑数据库的物理存储方式、检索算法的实现等具体问题,而只要把命令传给数据库引擎,然后从数据库引擎处获取结果数据就可以了。
根据数据库对数据组织方式的不同,数据库管理系统又分为几种类型,如关系数据库、对象数据库等。
其中关系数据库以表格的形式存储数据,是目前应用最广泛的数据库管理系统。
我们讲座中要用到的Access就是一种关系数据库管理系统。
一个关系数据库是由一个或多个数据表(Table)组成,而一个数据表又是由许多结构相同的记录(Record)组成,每条记录相当于数据表的一行,数据表的列又称为字段(Field),字段定义了该项数据内容的数据类型、数据宽度等。
有些数据库是以文件形式存在的,例如Access的一个MDB文件就是一个数据库,其所有的数据表都包含在文件的内部,而有些数据库则是指一个目录,例如Paradox和dBase就是使用目录的数据库,每个数据表在该目录下以独立的文件形式存在。
●CBuilder数据库开发环境CBuilder在其开发环境中提供了强大的数据库支持,使CBuilder开发的应用程序能够很方便地具有数据库访问能力。
首先,CBuilder提供了Borland公司的数据库引擎(Borland Database Engine,简称BDE),它是CBuilder数据库应用程序开发环境的核心。
BDE位于应用程序和DBMS的数据库引擎之间,使得应用程序可以更加方便地访问不同类型的数据库。
BDE支持直接访问Paradox和dBase数据库,通过合适的驱动程序和数据库引擎,BDE还可以访问FoxPro、Access、Infomix、DB2、Oracle等多种流行的桌面数据库和远程数据库,同时BDE也是CBuilder提供的众多数据库元件的功能基础。
CBuilder中包含了大量和数据库应用程序相关的元件,它们可分为数据库访问元件和数据控制元件。
数据访问元件位于Data Access元件栏中,主要包括DataSource控件、Table控件、Query控件等。
数据访问元件在运行过程中是不可见的,它主要是为应用程序提供一条访问数据库的通道。
数据控制元件位于Data Controls元件栏中,它们为应用程序提供可视化的用户界面,常用的数据控制元件包括DBNavigator、DBGrid、DBEdit、DBText等。
很多数据控制元件都是在普通的用户界面元件的基础上增加了数据感知能力,如DBEdit控件(数据库编辑控件),它不仅具有普通Edit控件的用户输入、编辑、浏览文本的能力,还可以和数据库访问元件关联在一起,从而具有浏览、编辑数据库记录的能力。
在CBuilder中开发数据库应用程序的基本思路是:使用数据访问元件与数据库建立联接,获取所需的数据集(Dataset),并将数据控制元件与数据访问元件相关联,实现用户浏览、操作数据的界面。
CBuilder的数据库开发环境中还包括几个工具软件,它们是BDE管理器(BDE Administrator)、SQL浏览器(SQL Explorer)、数据库桌面(Database Desktop)等。
BDE管理器是BDE管理和配置的工具软件,它可以创建和维护BDE数据库别名(Alias),安装和删除数据库驱动程序。
其中数据库别名是BDE引入的一个重要概念,它的意义和创建方法将在后面进行介绍。
数据库桌面是一个简单的数据库管理工具,可以进行许多基于数据表的操作,如创建数据表、修改数据表的结构以及查看和编辑数据表的内容等等。
SQL浏览器是一个数据库浏览工具,可以浏览数据库中的各种对象,如数据表、字段、索引等,还可以创建和维护数据库别名,编辑和显示数据表中的记录,以及对数据表执行SQL查询等。
其中,SQL的全称是结构化查询语言(Structured Query Language),它是目前使用得最广泛的一种标准的数据库查询语言,几乎所有的数据库都支持SQL语言。
●建立一个ACCESS数据库下面,我们以Mp3Collect程序为例,一步一步地学习如何在CBuilder中开发数据库应用程序。
第一步需要建立一个数据库。
我们以Microsoft的Access 2000为例来说明创建数据库的方法。
选用Access 2000是因为它是目前比较流行的桌面数据库,使用和管理起来都很方便。
首先启动Access 2000,选择新建空的数据库,在要求输入数据库名称和路径时输入“MP3Collect\MP3Collect.mdb”(即Mp3Collect所在目录)。
接下来在新建的空白数据库中选择表对象,并双击其中的“使用表设计器创建表”命令,创建一个数据表。
在表设计器中,依次定义四个字段:ID、FileName、SongName和SingerName。
后面三个字段的意义我们已经非常熟悉了,它们的数据类型定义为文本,FileName的字段大小为255,其它两个字段的大小为50,并且FileName字段中不允许空字符串,而SongName和SingerName允许空字符串。
另外,我们还要为这三个字段添加允许重复的索引,因为在程序中需要按照这三个字段对数据库进行查询,添加了索引的字段,可以加快查询的速度。
ID是自动编号类型的字段,这个字段的引入是为了给每个记录一个唯一的数字标识,在关系数据库中,这样的数字标识对提高访问效率和系统性能很有用。
另外,由于每条记录的ID是唯一的,我们可以为ID添加无重复的索引,并且指定其新值的产生方式为递增。
设置好这四个字段以后,关闭表设计器,这时Access会提示输入新表的名称,这里我们将其命名为MP3Info。
这样,数据库MP3Collect.mdb就创建好了,虽然这只是一个简单的单数据表的数据库,但是通过创建这个数据库,我们可以更直观地了解数据库、表、记录、字段、索引的概念,以及它们相互间的关系。
有兴趣的朋友不妨再在库中添加一个歌手档案数据库,学习关系数据库中多数据表之间是怎样关联起来的。
●创建ODBC数据源和使用数据库别名接下来我们要为MP3Collect.mdb数据库创建一个ODBC数据源。
什么是ODBC?它的全称是开放式数据库互联(Open Database Connectivity),这是一个数据库的访问标准。
由于不同的数据库在存储结构、检索算法上存在着很大的差异,为了使应用程序能够通过统一、通用的方法访问不同的数据库,微软提出了ODBC数据库访问标准。
目前几乎所有的数据库管理系统都支持ODBC标准。
CBuilder的BDE也具有ODBC接口,可以在CBuilder下访问支持ODBC的数据库。
数据源是ODBC 标准中的一个概念,它把一个具体的数据库定义成为一个数据源,数据源中指定了数据库的类型、所使用的驱动程序、所处的路径等信息。
应用程序在访问数据库时,只需要和数据源建立联接,而不用考虑数据库所处的具体位置。
这样,即使数据库所在的位置(如移到另一个目录中)发生了变化,我们只需要重新设置数据源,而不需要改变应用程序中的代码。
ODBC 数据源由操作系统进行创建和管理。
我们打开Windows 的控制面板中,找到并运行其中的ODBC 数据源工具,就会出现如图14-1所示的ODBC 数据源管理器,其中有用户数据源、文件数据源、系统数据源等多个选项。
我们在用户数据源选项页中单击“添加”按钮,弹出创建新数据源对话框,在其中选择数据源的驱动程序为MicrosoftAccess Driver(*.mdb),然后按下完成按钮。
接下来,系统会调用Access2000的ODBC 数据源安装对话框,如图14-2所示。
在其中输入数据源的名称MP3CollectDSN ,并通过“选择”按钮选择数据库“MP3Collect\MP3Collect.mdb ”,设置完成后,按下“确定”按钮,新的数据源MP3CollectDSN 就创建好了。
下面还要为MP3Collect.mdb 数据库创建和配置据库别名。
前面提到过,别名是BDE 引入的重要概念。
在CBuilder 的数据库访问元件中,很多元件都需要指定一个数据库的名称,这个名称通常就是数据库别名。
别名的作用和ODBC 数据源的作用很类似,它也定义了数据库的一些连接属性,如数据库类型、路径、连接参数等等。
基于BDE 的数据库应用程序可以通过简单地指定数据库的别名,就可以和数据库建立起连接。
创建别名可以通过BDE 管理器来完成。
在Windows 的控制面板中找到并打开BDE 管理器,如图14-3所示。
管理器的左边是Database 选项页和Configuration 选项页,前者用于创建和维护BDE 数据库别名,后者用于配置BDE 驱动程序。
在Database 选项页中,我们看到,数据源MP3CollectDSN 也位于其中,说明ODBC数据源同样可以作为BDE 数据库别名来使用。