BCB讲座第十五讲简单数据库查询操作_第1页
BCB讲座第十五讲简单数据库查询操作_第2页
BCB讲座第十五讲简单数据库查询操作_第3页
BCB讲座第十五讲简单数据库查询操作_第4页
BCB讲座第十五讲简单数据库查询操作_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、简单数据库查询操作上一讲我们学习了数据库编程的基础知识,并对 MP3Collect 进行了一番改造,使其具有数据库 访问能力。在本讲中,我们首先设置三个数据库元件 Query1、 DataSource1和 DBGrid1的属性,接 下来学习如何通过 Query 控件实现简单的数据库查询操作。设置控件属性Query1控件的用途是查询数据库,获取可以显示在窗体中的数据。 Query 控件和 Table 控件一 样,它们都是从 VCL 类 TDataSet (数据集元件中继承来的,都代表数据库中一组记录的集合。不 同的是, Table 控件代表库中实际存在的一个数据表对象, 而 Query 控件则代

2、表一次查询的结果。 Query 控件支持通过 SQL 进行查询,因此比 Table 控件具有更大的灵活性,它可以同时访问多个数据表, 可以灵活访问数据表中的行和列,可以实现十分复杂的条件查询。SQL 的全称是结构化查询语言,它是一种标准的数据库查询语言,具有自己的关键字(SQL 中 的关键字是不分大小写的, SELECT 和 Select 的作用是相同的和语法,典型的 SQL 查询语句如下 所示:SELECT 字段名 FROM 数据表名 WHERE 条件子句 其中 SELECT 、 FROM 和 WHERE 都是 SQL 的关键字。 SELECT 代表查询操作, “字段名”表示返 回的记录集中

3、所包含的字段,字段名可以使用通配符 *,表示查询的数据表中的所有字段, “数据表 名”表示在哪个数据表中进行查询, “条件子句”为查询的条件。了解了 SQL 的基本语法后, 下面我们来设置 Query1控件的 SQL 属性。 在对象监视器中双击 Query1控件的 SQL 属性(该属性为 TStrings*类型 ,打开字符串列表编辑器,在其中输入这样两句“ Select * From MP3Info”和“ Order by FileName ASC”。注意第二句要另起一行,这样在后面的编程中可以 很方便地改变记录的排序方式。这两句合在一起的意思是获取 MP3Info 数据表中的所有记录,并以

4、FileName 字段为基准按升序方式排序。除了指定 Query1控件的 SQL 属性外,还要指定它在哪个数据 库中进行查询,将其 Database 属性设为别名 MP3Collect 。然后指定其 Active 属性为 true ,其它属性值 都接受缺省值。DataSource 控件从字面上可翻译为数据源控件, 不过它与上一讲介绍的 ODBC 数据源可不是一回 事。 DataSource 控件是一个中间控件,它位于数据集控件(如 Table 控件或 Query 控件和数据控制控 件(如 DBGrid 控件或 DBEdit 控件之间,是联系两类控件的桥梁。 DataSource 控件最重要的属

5、性是 它的数据集属性 DataSet ,在对象浏览器中点击该属性右侧的下拉式列表框,可以看到其中列出了 Table1和 Query1,我们选中 Query1,表示 DataSource 控件从 Query1中获取数据。DBGrid 控件是一种常用的数据控制元件,它以表格的方式显示记录,表格中的行表示记录,而 列表示记录的字段。 所有的数据控制元件都必须和某个 DataSource 控件相关联, 才能获取所需要的数 据, 因此我们在这里将 DBGrid1控件的 DataSource 属性设为 DataSource1。 指定 DBGrid1的数据来源后, 我们可以看到 DBGrid1的表格中立即显

6、示出相应的记录了。缺省情况下, DBGrid1会显示数据集的全部字段,并以字段的名称显示在列标题中,我们可以 在设计时通过 DBGrid 控件的列编辑器修改列的数目、 标题以及布局等。 在对象浏览器中双击 Columns 属性,打开列编辑器,此时列编辑器中的内容还是空的,因此我们在列编辑器中点击鼠标右键,选 择关联菜单中的“ Add All Field”命令,先把数据集中的所有字段添加进来。由于我们不希望将记录 的编号显示出来,所以要删除其中的“ ID ”字段。接下来我们来设置各列的列标题。首先选中“ FileName ”列,这时可以在对象浏览器中看到该 列的各种属性,其中 FieldName

7、 属性为“ FileName ”,表示该列显示“ FileName ”字段的内容,列对 象的 Title 属性为复合属性,展开 Title 属性,将其中的 Caption 子属性改为“文件名称”,然后设置“ FileName ”列的列宽度,其缺省的 Width 属性为 -1,表示根据字段的宽度自动设置列宽度,我们可 以根据窗体的布局为其重新设置一个实际的值。按照同样的方法,我们继续把“ SongName ”、 “ SingerName ”的列标题改为“歌曲名称”和“歌手名称”。设置好 DBGrid1控件的列对象的属性后,接下来还要设置它的 Options 属性,该属性决定了显示 记录的方式。展

8、开 DBGrid1控件的 Options 属性,可以看见其中有十多项选项,将其中的 dgEditing 、 dgAlwaysShowEdit 和 dgMultiSelect 三个选项设为 false ,其余的选项都设为 true ,如此设置可以屏蔽在 DBGrid 中直接修改记录以及同时选中多条记录的功能。另外还可以设置 DBGrid1的 ReadOnly 属性为 true ,使用户不能在网格中进行添加、修改、删除记录的操作。最后,设置 DBGrid1的 PopupMenu 属 性为 PopupMenu1,为其指定关键菜单。现在所有元件的属性都设置好了,下面我们来看看访问数据库的具体方法。为了

9、简洁起见,下 面的代码中都没有异常处理措施,读者朋友可以根据第 13讲的内容自己添加相应的异常处理代码。 实现查询功能Table 控件和 Query 控件都可以实现查询,但 Table 不支持 SQL ,只能通过数据表中的索引实现 比较简单的检索功能(在后面还会用到 Table 的查询功能 ,因此心铃决定用 Query1控件进行查询, 提供显示在 DBGrid1中的数据。所有的查询都是通过设置 Query1控件的 SQL 属性来完成的。实现显示所有记录的 SQL 语句最 简单,即前面给出的 SQL 属性。下面是 btnShowAllClick 事件处理函数的新代码,其中给出了在运 行时改变 Q

10、uery 控件 SQL 属性的方法。void _fastcall TMainForm:btnShowAllClick(TObject *SenderQuery1-Close(;/先关闭上一次查询Query1-SQL-Clear(;/清除原来的 SQL 语句Query1-SQL-Add(Select * from MP3Info;/添加一个字符串, SQL 属性由多个字符串组合而 成Query1-SQL-Add(Order By FileName ASC;ColumnToSort=0;/记下当前排序的基准列为“ FileName ”m_IsAsc=1;/记下当前排序的方式为升序方式Query1-

11、Open(; /设置好 SQL 属性后,打开 Query1,获取数据并自动更新 DBGrid1在改变 Query1的 SQL 属性之前,首先应将上一次查询关闭。 SQL 属性是一个 TStrings 对象指 针,它将多个字符串组成一个完整的 SQL 查询语句,其中的 Order By 是 SQL 中的关键字,表示按 照某一个字段进行排序, ASC 是排序方式关键字,表示升序方式。 ColumnToSort 和 m_IsAsc是 MainForm 类的成员变量, 用于保存排序的基准列号和排序方式, 有关排序的内容还要在下一节仔细 介绍。设置好 SQL 属性后,调用 Query 控件的 Open(

12、方法,该方法会通过 BDE 引擎向数据库进行 一次查询操作,获取所需的数据,并自动更新 DBGrid1中显示的数据。条件查询操作需要使用 SQL 语句中的 WHERE 条件子句。 查询的原理是依次读取三个条件输入 框的内容,如果某一条件输入框不为空,则添加一个查询条件。这里使用的查询条件的语法如下所 示:字段名 Like 带通配符的字符串 其中 字段名 为要检查的字段, LIKE 为 SQL 的关键字, 表示将字段内容与 “带通配符的字符串” 进行比较,看是否符合给定的模式。 “带通配符的字符串”需要用单引号包括起来,常用的通配符有 “ %” 、 “?”等。其中“ %”表示任意字符串。例如,下

13、面的 SQL 语句表示从 MP3Info 中取出所有 FileName 字段中包括“ MP3”字样的记录:SELECT * FROM MP3Info WHERE FileName Like %MP3%另外,在 MP3Collect 中,各个查询条件之间是逻辑与的关系,因此多个查询条件之间要用关键 字 AND 进行连接, 表示只有符合所有查询条件的记录才是所需要的记录。 下面是 btnFindClick 事件 处理函数的新代码:void _fastcall TMainForm:btnFindClick(TObject *SenderQuery1-Close(;/首先关闭 Query1Query1

14、-SQL-Clear(;/清除原有的 SQL 语句Query1-SQL-Add(Select * from MP3Info;/表示从数据表中 MP3Info 中查询/如果 edtFileName 不为空,则添加对 FileName 字段的查询,注意不要漏了其中的单引号 if(!edtFileName-Text.IsEmpty(Query1-SQL-Add( where FileName Like %+edtFileName-Text+%;/如果 edtSongName 不为空,则添加对 SongName 字段的查询,由于整个条件子句中只有 /一个 WHERE 关键字,多个条件之间需要用 AND

15、 关键字连接,所以要进行一些特殊处理 if(!edtSongName-Text.IsEmpty(if(Query1-SQL-Count1/判断是否已经包含查询条件了Query1-SQL-Add( and ;/如果是,则用 AND 连接本查询条件elseQuery1-SQL-Add( where ;/否则用 WHERE 引出查询条件Query1-SQL-Add(SongName Like %+edtSongName-Text+%;/添加一个查询条件 /如果 edtSingerName 编辑框中不为空,则添加对 SingerName 字段的查询if(!edtSingerName-Text.IsEm

16、pty(if(Query1-SQL-Count1/判断是否已经包含查询条件了Query1-SQL-Add( and ;/如果是,则用 AND 连接本查询条件elseQuery1-SQL-Add( where ;/否则用 WHERE 引出查询条件Query1-SQL-Add(SingerName Like %+edtSingerName-Text+%;/添加一个查询条件 Query1-SQL-Add( Order By FileName ASC;/添加排序子句ColumnToSort=0;/记下当前排序的基准列为“ FileName ”m_IsAsc=1;/记下当前排序的方式为升序方式Query

17、1-Open(;实现排序前面我们已经用到了 SQL 语言的排序子句, 排序子句是由关键词 Order By引出的, 其后跟一个 或多个字段,表示以某个字段为基准进行排序,如果有多个字段,则先按第一个字段进行排序,如 果出现第一个字段的内容相同,再按第二个字段排序,依此类推。另外还可以用 ASC (升序方式 和 DESC (降序方式规定其排序的方式。我们在 TMainForm 中添加了一个成员变量 m_IsAsc,用于保存当前排序的方式,注意应在窗体 的初始化函数 FormCreate 中将 m_IsAsc初始化为 1。下面是菜单命令 mnuSortByFileName 的命令处 理函数:voi

18、d _fastcall TMainForm:mnuSortByFileNameClick(TObject *Senderif(ColumnToSort!=0/如果以前不是按 FileName 字段排序,则改为按 FileName 字段排序 Query1-Close(;Query1-SQL-Delete(Query1-SQL-Count-1;/清除原来的排序子句Query1-SQL-Add(Order By FileName ASC;/添加新的排序子句ColumnToSort=0;/记下当前排序的基准列为“ FileName ”m_IsAsc=1; /记下当前排序的方式为升序方式Query1-Open(;else /否则切换排序的方式Query1-Close(;Query1-SQL-Delete(Query1-SQL-Count-1;if(m_IsAscQuery1-SQL-Add(Order By FileName DESC;/如果原来是升序,改为降序elseQuery1-SQL-Add(Order By FileName Asc;/如果原来是降序,改为升序m_IsAsc=1-m_IsAsc;/改变 m_IsAsc的值,反映排序方式的改变Query1-Open(;/打开 Query1另外两个排

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论