用Delphi编写小型数据库(五)——数据库的备份和恢复
编程爱好者
技术看点:保障数据库安全的操作技巧,快速复制表,高效录入编程技巧
学会前四章的内容,我们已经可以独立开发一个小型数据库项目了。最后一章我们介绍数据库的备份和恢复以及部分编程小技巧。
一、数据库的备份
数据库在运行一定的时间后数据量会增大,随着数据量越来越庞大,系统执行查询的效率就会越来越低,我们就需要清理数据。清理数据前一定要对数据库进行备份,便于以后需要时恢复数据库来查询前期的数据,备份数据库的步骤如下:
1.分离数据库
只有先把数据库分离出来才能备份。启动Microsoft SQL Server 2000的企业管理器,选择一个数据库,在右键菜单中选择“所有任务”→“分离数据库”(图1),在弹出的对话框中点击“确定”按钮,这样数据库test就脱离开了。

2.复制数据库文件
还记得我们创建test数据库的目录吗?在第一章里,我们创建的test数据库存放在D盘根目录下面,现在我们启动Windows资源管理器,找到test_Data、test_Log两个文件,并把这两个文件复制后保存到你的闪盘或者其他地方,这样我们就对test做好备份了。
二、数据库的恢复
选择“数据库”后,在右键菜单中选择“所有任务”→“附加数据库”(图2),弹出对话框,点击“...”按钮,指定要附加的数据库文件(*.MDF),然后点击“确定”按钮,这样我们就恢复了test数据库,在企业管理器的数据库目录下就能找到test了。

三、复制表
在第三章中,我们创建了两张表TB_ SplitCutPlan和L2_SplitCutPlan,这两张表一模一样,我们定义表TB_ SplitCutPlan是一个字段一个字段进行定义的,实际上这张表包含了多达70多个字段。如果我们再来一个字段一个字段定义L2_SplitCutPlan,工作量大不说,极容易出错,采用复制表的方法势必简单易行。下面详细介绍如何复制表:
1.在MS SQL Server的企业管理器中,右击一张表,选择复制到剪贴板。
2.选择“工具”的“SQL查询分析器”, 在查询分析器的查询窗口右击,在弹出菜单中选择“粘贴”,就把表SplitCutMatTrack的创建代码复制到查询窗口了(图3)。

3.在查询窗口中,把表的名字改为你希望的新表的名字,比如test1,第一行就变成了:“CREATE TABLE [test1] (”(没有引号),如果不希望把所有的字段都复制,仅仅希望复制部分字段,在代码中可以根据自己的需要删减字段。
4.选择一个数据库,如图1中的右上角,新表将建立在这个数据库中。
5.确定了数据库后,在图中点击三角形的执行查询按钮,如果成功将显示“命令已成功完成。”这时新表就建立起来了,并且和表SplitCutMatTrack的结构一样。
6.要复制记录先清空查询窗口,按“CTRL+A”后再按Delete键,然后在查询窗口中输入“insert into [test1] select * from [SplitCutMatTrack]”,如果成功将显示“(所影响的行数为XX行)”。
小技巧:
如果被复制的表的字段设置有标志,按上述步骤建立了表后不能复制记录,系统会提示:
“服务器: 消息 8101,级别 16,状态 1,行 1,仅当使用了列的列表,并且 IDEN
TITY_INSERT 为 ON 时,才能在表 'test1' 中为标志列指定显式值。”
处理方法为:把[flag] [bigint] IDENTI
TY(1, 1) NOT NULL改为[flag] [bigint] NOT NULL。
即把IDENTITY (1, 1)删除,这样就可以复制记录了,最后在新表中手动设置标志。
四、数据库编程小技巧
1.自动选中编辑框中的部分字符
在做账时,需要在多个Edit中录入很多信息,然后提交到数据库,一般Edit中有默认的字符,在Edit编辑框中只须改写最后一个或两个字符再按TAB键切换到下一个Edit,在此Edit中也只须修改一个或两个字符后又要按TAB键进行切换。麻烦的是每次按TAB键后,系统默认会自动选中所有的字符,需要用鼠标+键盘删除最后两个数字然后再录入,既耗时又耗力。其实可以像图4那样按下TAB键后Edit直接选中最后两个数字,这样就节省了人力,直接录入就行了。

实现原理:
当Edit成为焦点后,要确定两件事:1.从哪一个字符开始被选中;2.选中多少个字符,使用TEdit类的属性SelStart可以定位从哪一个字符开始被选中,SelLength可以指定选中字符的个数。
实现方法:
在Delphi开发环境中,选中一个Edit组件,在事件OnEnter中写下面代码:
procedure TForm1.Edit6Enter(Sender: TObject);
begin
Edit6.SelStart:=9;
Edit6.SelLength:=2;
end;
2.隔行改变DBGrid网格颜色
Delphi的DBGrid控件有一个Color属性可以改变网格颜色,但只能对网格设置单一的颜色,如果有多条记录,从美观出发,网格的单一颜色很不友好;从使用者角度出发,记录过多,密密麻麻的数据很容易使眼睛疲劳,特别是财务人员整天看一屏一屏的数据特别容易出错,如果把DBGrid的网格颜色设置为两种,交叉显示将大大提高工作效率,下面详细介绍隔行改变DBGrid网格颜色的方法。
(1)启动Delphi,在 Form1 上放置ADOConnection1、DBGrid1、ADODataSet1、DataSource1 三个数据库组件。
(2)设置相关的属性,ADOConnection1连接一个数据库,ADODataSet1连接这个数据库的一张表,并使 DBGrid1 能显示表中的数据。
(3)然后,在DBGrid1的 OnDrawColum
nCell 事件中键入以下代码:
procedure TForm1.DBGrid1DrawColum
nCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var i:integer;
begin
if gdSelected in State then Exit; //隔行改变网格背景色:
if adodataset1.RecNo mod 2 = 0 then
(Sender as TDBGrid).Canvas.Brush.Col
or := clinfobk //定义背景颜色
else
(Sender as TDBGrid).Canvas.Brush.Col
or := RGB(191, 255, 223); //定义背景颜色
//定义网格线的颜色:
DBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
with (Sender as TDBGrid).Canvas do //画 cell 的边框
begin
Pen.Color := $00ff0000; //定义画笔颜色(蓝色)
MoveTo(Rect.Left, Rect.Bottom); //画笔定位
LineTo(Rect.Right, Rect.Bottom); //画蓝色的横线
Pen.Color := clbtnface; //定义画笔颜色(蓝色)
MoveTo(Rect.Right, Rect.Top); //画笔定位
LineTo(Rect.Right, Rect.Bottom); //画绿色
end;
end;
(4)运行程序后,效果如图5。

编后:到此,本系列就全部结束了。我们依次为大家介绍了:Delphi与MS SQL Server联合编程的基础知识,建立数据库的一般方法,对数据库的记录的查询、修改、删除,然后通过一个小型工业控制管理系统的编写为例加深了大家的认识。最后还结合应用实际,介绍了如何实现打印输出以及保障数据库安全的备份和恢复操作。相信通过本系列的学习,你将具备编写小型数据库的基本能力,愿大家今后能通过更深入的学习继续得到提高。