BCB讲座第十六讲简单数据库编辑操作.doc_第1页
BCB讲座第十六讲简单数据库编辑操作.doc_第2页
BCB讲座第十六讲简单数据库编辑操作.doc_第3页
BCB讲座第十六讲简单数据库编辑操作.doc_第4页
全文预览已结束

下载本文档

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

文档简介

简单数据库编辑操作上一讲我们学习了利用Query1控件和SQL语句实现简单数据库查询的方法,在本讲中,我们将要学习如何利用Table1控件来实现添加、修改、删除记录等数据库编辑操作。l 获取当前记录在上一讲中我们曾经比较过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的记录光标调整到相同的记录上。前一讲中介绍过,Table控件也具有一定的查询能力,FindKey()就是它的查询方法之一,其原理是利用数据表的索引进行快速的检索操作。查询的步骤如下:首先设置Table控件的IndexName属性。在窗体设计阶段,我们已经将Table1控件的IndexName属性设为ID,选择ID作为Table1的索引,是因为每个记录的ID值是唯一的,不用担心会检索出重复的记录。在运行时确认Table1处于打开的状态,然后调用其FindKey()方法,查找数据表中ID值与Query1控件的当前记录ID值相等的记录,同时将Table1的光标移到新的记录上。下面就是Query1AfterScroll的实现代码。void _fastcall TMainForm:Query1AfterScroll(TDataSet *DataSet)if(Query1-State=dsBrowse )/如果Query1控件当前处于记录浏览状态if(!Query1-IsEmpty()/如果Query1的数据集不为空/声明TVarRec类型的变量数组,FindKey()方法使用该类型的数组作为参数。TVarRec KeyValues1; /获得Query1控件的当前记录的ID字段内容,并赋给KeyValues数组中的第一个元素KeyValues0=Query1-FieldByName(ID)-AsInteger;if(!Table1-Active) /如果Table1还未打开,将其打开Table1-Active =true;Table1-FindKey(KeyValues,0);/调用FindKey()方法,查找并定位新的记录光标/获取Query1控件当前记录的各个字段内容,并赋给相应的编辑框edtFileName-Text=Query1-FieldByName(FileName)-AsString;edtSongName-Text=Query1-FieldByName(SongName)-AsString;edtSingerName-Text=Query1-FieldByName(SingerName)-AsString;/在MediaPlayer1中打开相应的音乐文件MediaPlayer1-FileName=Query1-FieldByName(FileName)-AsString;MediaPlayer1-Open();l 移动当前记录为了实现向前、向后浏览和连续播放的功能,我们需要通过程序控制数据集的光标移动。其中,向前移动一条记录使用TDataSet类的Prior()方法,向后移动一条记录使用Next()方法,移动到第一条记录使用First()方法,移动到最后一条记录使用Last()方法。TDataSet类还提供了两个布尔类型的属性Bof和Eof,用于确定当前的记录是否是数据集中的第一个记录或最后一个记录。下面给出用户点击MediaPlayer的Next和Prev按钮时的事件处理代码(完整的事件处理函数参见第11讲):case Mplayer:btNext: /如果用户点击Next按钮,播放下一首MP3文件EnableButtons(false);/使记录操作按钮失效Query1-Next();/使Query1控件的记录光标向后移动一条记录if(Query1-Eof)/如果Query1控件的Eof属性为真,则表示已到了最后一个记录Query1-First();/循环到当前数据集的第一个记录m_bIsPlaying=true; /设置m_bIsPlaying标志DoDefault=false; /不执行缺省的按钮事件PlayTheSong();/执行打开MP3文件、播放MP3文件等操作Timer1-Enabled=true; /打开定时器break;case Mplayer:btPrev: /如果用户点击Prev按钮,播放上一首MP3文件EnableButtons(false);Query1-Prior();/使Query1控件的记录光标向前移动一条记录if(Query1-Bof)/如果Query1控件的Bof属性为真,则表示已到了第一个记录Query1-Last();/循环到当前数据集的最后一个记录m_bIsPlaying=true;DoDefault=false;PlayTheSong();Timer1-Enabled=true;break;Timer1的时间事件处理函数如下所示:void _fastcall TMainForm:Timer1Timer(TObject *Sender)if(MediaPlayer1-Position = MediaPlayer1-Length) /如果已经播放到一个文件的末尾/检测chkLoop是否处于选中状态,以及媒体播放器是否处于播放状态if(chkLoop-Checked & m_bIsPlaying)Query1-Next();/使Query1控件的记录光标向后移动一条记录if(Query1-Eof)/如果Query1控件的Eof属性为真,则表示已到了最后一个记录Query1-First();/循环到当前数据集的第一个记录elseEnableButtons(true);/使记录操作按钮有效Timer1-Enabled =false;/关闭定时器l 添加记录TTable控件类提供了两种添加记录的方法,它们是Insert()和Append()。其中Insert()方法在当前记录处添加一条新的记录,而Append()则是在数据表的最后添加一条新记录,在MP3Collect中我们要使用的是前者。Insert()方法向数据表中添加一条空白的记录,并使Table控件处于记录添加状态。接下来设置新记录的各个字段值,利用TTable类的FieldByName()方法可以获取当前记录的各个字段对象。VCL为字段提供了封装类TField,根据字段不同的数据类型,TField类又提供了As*属性,用于读写其字段值。在MP3Info数据表中,FileName、SongName、SingerName都是文本类型,因此使用TField类的AsString属性来读写它们的内容。设置好新记录的各个字段值后,需要调用Table控件的Post()方法将此次操作保存到数据库中,如果用户放弃了这次操作,也可以调用Cancel()方法取消这次添加操作。Post()和Cancel()都可以结束记录添加状态,使Table控件恢复成记录浏览状态。下面给出“添加”按钮的命令响应函数btnAddClick()的新代码,另外一个同时添加多条记录的函数mnuAddClick()留给读者朋友自己完成。void _fastcall TMainForm:btnAddClick(TObject *Sender)if(edtFileName-Text.IsEmpty()/判断文件名编辑框中是否为空Application-MessageBox(文件名称不能为空,请重新输入文件名称!,MP3Collect,MB_OK);edtFileName-SetFocus();/令文件名编辑框获得键盘输入焦点return;Table1-Insert();/添加一条空白记录Table1-FieldByName(FileName)-AsString=edtFileName-Text;/设置FileName字段Table1-FieldByName(SongName)-AsString=edtSongName-Text;/设置SongName字段Table1-FieldByName(SingerName)-AsString=edtSingerName-Text;/设置SingerName字段Table1-Post();/保存这次添加操作所作的修改RefreshQuery();/更新Query控件中的数据,同时也更新窗体中的显示在成功地添加了记录之后,还需要更新窗体上显示的数据,也就是要更新Query1控件中的数据。由于在进行添加、修改、删除记录等操作之后同样要进行这一步骤,我们为MainForm窗体类添加了一个新的成员函数RefreshQuery()来完成这一工作。更新Query1的方法比较简单,只需要先关闭一次,再重新打开就可以。为了保证在更新后还能恢复正确的记录光标位置,我们利用了数据集控件的书签对象(Bookmark)来保存和恢复记录光标位置。RefreshQuery()函数如下所示:void _fastcall TMainForm:RefreshQuery()TBookmark * bm=(TBookmark *)Query1-GetBookmark();/获取当前Query1控件的书签对象Query1-Close();/先关闭Query1Query1-Open();/再重新打开Query1,即可更新其中的数据Query1-GotoBookmark(bm);/利用书签对象恢复记录光标的位置Query1-FreeBookmark(bm);/释放书签对象l 修改记录和删除记录由于前面已经为Table1控件和Query1控件的光标位置作了同步调整,因此可以保证在Table1中修改和删除的记录是用户当前所选择的记录。修改记录的步骤是:首先调用Table1控件的Edit()方法,使其处于记录修改状态,再设置当前记录的各个字段值,设置方法与添加记录中一样,接下来调用Table1控件的Post()方法保存这次修改,并关闭记录修改状态,回复到记录浏览状态,最后调用RefreshQuery()函数更新显示数据。删除记录的操作最简单,只要调用Table1控件的Delete ()方法就可以删除其当前的数据记录。下面是“修改”和“删除”按钮的命令响应函数的实现代码:void _fastcall TMainForm:btnModifyClick(TObject *Sender) /“修改”按钮的命令响应函数Table1-Edit();/使Table1控件处于记录编辑状态Table1-FieldByName(FileName)-AsString=edtFileName-Text;/修改FileName字段Table1-FieldByName(SongName)-AsString=edtSongName-Text;/修改SongName字段Table1-FieldByName(SingerName)-AsString=edtSingerName-Text;/修改SingerName字段Table1-Post();/保存这次操作所作的修改RefreshQu

温馨提示

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

评论

0/150

提交评论