收稿日期:2003202228  作者简介:孙勇(19672),男,江苏无锡人,南昌铁路局科学技术研究所工程师,研究方向:软件开发,数据库技术。
文章编号:100622475(2003)0520080203
用Delphi 备份SQL Server 数据库的方法
孙 勇
(南昌铁路局科学技术研究所,江西南昌 330002)
摘要:基于实践,描述了用Delphi 开发数据库管理系统时,采用应用软件备份数据库的简便方法。关键词:Delphi ;数据库/存储过程;ADO ;备份/恢复;S Q L Server 2000/Access 中图分类号:TP311.13   文献标识码:A
Methods of B acking up SQ L Server Database with Delphi
S UN Y ong
(Institute of Science and T echnology ,Nanchang Railway Bureau ,Nanchang  330002,China )
Abstract :Describes the sim ple methods of backing up S Q L Server database with Delphi ,in development of database management system.K eyw ords :Delphi ;database/stored procedure ;ADO ;Backup/Restore ;S Q L Server 2000/Access
0 引 言
用Delphi 开发数据库管理系统是非常便捷的,而
在一个系统中最重要的是大量的实时数据,没有备份功能显然是不安全和不完善的。笔者经过摸索通过以下几种简单的方法,能够有效地对S Q L Server 数据库进行备份和恢复。本文主要描述在S Q L Server 2000环境下的操作方法,并将各种方法的优缺点进行比较。文中例程所用到的数据库控件之C onnection 均指向DataM odule1.ADOC onnection ,ADOC onnection.Login 2Prom pt 设为False 自动登录,以下就不作特别说明。
1 直接用SQ L 语句进行备份
S Q L Server 提供了两条简单的S Q L 语句,分别用
于数据库的备份和还原。例如:对数据库testdb 备
份,备份文件为testdb.bak ,用于备份和恢复的语句分别为:
BACK UP DAT ABASE testdb T O DISK =′c :\tem p \testdb.bak ′WITH FORM AT
REST ORE DAT ABASE testdb FROM DISK=′c :\tem p \test 2db.bak ′
参数WITH FORMAT 指定每次备份都覆盖备份文件。
需注意的是,数据库恢复操作要在该数据库没有使用的情况下进行,即使有控件的连接(比如ADO 连接)也应关闭(close ),否则恢复将不会成功。此方法执行速度很快,整个数据库的备份和恢复也很完整。
在Delphi 中新建一应用程序,在form 中添加一按钮button1及ADOcommand1控件,假设备份文件在d :\tem p \testdb.bak 。程序过程代码如下:
procedure TF orm1.F ormCreate (Sender :T Object );begin
DataM odule1.ADOC onnection1.C onnectionS tring :=′Provider =S Q LO LE DB.1;′+′Persist Security In fo =False ;User I D =sa ;Ini 2tial Catalog =testdb ;Data S ource =ysun ′;
End ;
procedure TF orm1.Button1Click (Sender :T Object );begin
with DataM odule1do begin
 adocommand1.C onnection :=DataM odule1.ADOC onnec 2
tion1;
 adocommand1.C ommandT ext :=′BACK UP DAT ABASE test 2
db T O DISK =′+′′′′+′d :\tem p \testdb.bak ′+′′′′+′WITH FORM AT ′;
 adocommand1.C ommandT ype :=cmdT ext ; adocommand1.Execute ;
end ;
 2003年第5期
计 算 机 与 现 代 化
J IS UAN J I Y U XI ANDAIH UA
 总第93期
showmessage(′数据库备份完成!′);
end;
procedure TF orm1.Button1Click(Sender:T Object);
begin
with DataM odule1do
begin
 adoquery1.C onnectionS tring:=′Provider=S Q LO LE DB.1; Persist Security In fo=False;′+′User I D=sa;Initial Catalog=mas2 ter;Data S ource=ysun′;//注意这里连接的数据库是master  adoquery1.S Q L.Clear;
 adoquery1.S Q L.Add(′USE master′);
 adoquery1.S Q L.Add(′REST ORE DAT ABASE testdb FROM disk=′+′′′′+′d:\tem p\testdb.bak′+′′′′);
sqlserver备份表语句 adoquery1.S Q L.Add(′USE testdb′);
 adoquery1.ExecS Q L;
end;
showmessage(′数据库恢复完成!′);
 end;
2 利用创建的逻辑备份设备进行备份创建逻辑设备有两种方法,首先依次选择:企业管理器→管理→备份,鼠标右键单击选择新建备份设备,输入设备名称和备份文件名及存放路径,点击确定即可。另外可以在master中建立两个存储过程,分别用于创建逻辑设备和备份数据库。选择企业管理器→数据库→master→存储过程,右键单击选择新建存储过程,内容如下:
创建逻辑设备:
Create Procedure testpro as
EXEC sp addum pdevice′disk′,′testbak′,′c:\tem p\testdb. bak′
G O
其中testpro为存储过程名,testbak为逻辑设备,后面为备份文件。已有逻辑设备不能重复创建。进入S Q L查询分析器,输入‘select name from sysdevices’语句执行查询,可看到当前数据库的所有逻辑设备。
备份存储过程:
Create Procedure testdb bak as
Backup Database testdb T o testbak WITH FORM AT
G O
其中testdb为数据库名,testbak为上面创建的逻辑设备名。
下面是Delphi程序的实现过程:
procedure TF orm1.F ormCreate(Sender:T Object);
begin
DataM odule1.ADOC onnection1.C onnectionS tring:=′Provider =S Q LO LE DB.1;′+′Persist Security
In fo=False;User I D=sa;Ini2 tialCatalog=master;Data S ource=ysun′;
 //建立ADO连接到master
end;
procedure TF orm1.F ormShow(Sender:T Object);
begin
adostoredproc1.C onnection:=DataM odule1.ADOC onnection1;
adocommand1.C onnection:=DataM odule1.ADOC onnection1;
end;
procedure TF orm1.Button1Click(Sender:T Object);
begin
ad ostoredproc1.ProcedureName:=′testpro′;//指定存储过程名
adostoredproc1.ExecProc;
showmessage(′备份设备成功创建′);
end;
procedure TF orm1.Button2Click(Sender:T Object);
begin
with DataM odule1do
begin
 adocommand1.C ommandT ype:=cmdT ext;
 adocommand1.C ommandT ext:=′sp dropdevice′+′′′′+′testbak′+′′′′;
 adocommand1.Execute;
end;
showmessage(′备份设备成功删除′);
end;
procedure TF orm1.Button3Click(Sender:T Object);
begin
with DataM odule1do
begin
 adostoredproc1.ProcedureName:=′testdb bak′;
 adostoredproc1.ExecProc;
end;
showmessage(′数据库备份完成′);
end;
procedure TF orm1.Button4Click(Sender:T Object);
begin
with DataM odule1do
begin
 adoquery1.C onnection:=DataM odule1.ADOC onnection1;
 adoquery1.S Q L.Clear;
 adoquery1.S Q L.Add(′USE master′);
 adoquery1.S Q L.Add(′REST ORE DAT ABASE testdb FROM testbak′);
 adoquery1.S Q L.Add(′USE testdb′);
 adoquery1.ExecS Q L;
end;
showmessage(′数据库还原完成′);
end;
3 用数据库表“对倒”方法备份
通过两种数据库相应表的数据对倒,也可以达到
18
2003年第5期  孙勇:用Delphi备份S Q L Server数据库的方法
备份数据库的目的,以下采用S Q L Server 与Access 两
种数据库间的对倒。首先,利用Access 建立一个空数据库test.mdb ,进入S Q L Server 企业管理器,到要备份的数据库,鼠标单击右键选择所有任务→导出数据→选择数据源(默认为当前数据库)→选择目的地Micros oft Access →指定为test.mdb →单击下一步,将全部用户数据导入Access 数据库中。其次,在
S Q L Server 数据库中新建一个备份对照表usertb ,字段名为tbname ,将该数据库中要备份的表名
称依次加入该字段中。因为两边的数据表结构完全一致,所以在程序设计中直接对倒就可以,无须另外转换数据类型。
需要说明的是,这种方式备份数据比较自由灵活,比如按条件汇总上报与分发,也可以设计进度条动态观察。缺点是数据库备份不完整,此外速度较慢,对少量数据的备份尚可。
图1是表间对倒的图示说明,由于篇幅所限,源程序在此省略。
图1 两种数据库相应表间的数据对倒
4 用BCP 实用程序备份
BCP 是S Q L Server 系统提供的一个块拷贝实用
程序,该程序可以把数据库表中的数据拷贝到数据库
之外,反之也可以将外部数据拷贝到数据库中。用BCP 实用程序会影响到数据库的完整性,因为在执行块拷贝时,规则和触发器都被忽略掉了。BCP 带的命令行参数很多,具体可在MS 2DOS 方式下键入BCP 回
车查看:
BCP.EXE {[[database
name.][owner.]]table
name |
query}{in |out |query out |format}datafile [2m maxerrors][2f for 2matfile ][2e err file ][2F firstrow][2L lastrow][2b batchsize ][2n native type ][2c character type ][2w wide character type ][2N keep non 2text native][2V file format version ][2q quoted identifier ][2C code page specifier][2t field terminator ][2r row terminator ][2i inputfile ][2o outfile ][2a packetsize ][2S server name ][2U username ][2P pass
w ord][2T trusted connection ][2v version ][2R regional enable ][2k keep null values][2E keep identity values][2h ″load hints ″]
主要参数说明:①database name ,数据库名;②owner ,表的所有者;③table name ,数据库表名;④in|out|format ,导入/导出/根据选项(2n ,2c ,2w ,2b ,2N )和分界符创建格式文件;⑤
datafile ,带有完整路径的系统数据文件名;⑥2S server name ,数
据库服务器名,缺省为本地服务器;⑦2U username ,登录帐号名称,该帐号须有操作权限;⑧2P pass w ord ,登录帐号密码。
例如:BCP ″cbgl..kmmc ″out d :\tem p \ 2c 2S ″
ysun ″2U ″sa ″2P ″″拷贝数据库cbgl 中表kmmc 到指定目录下。
BCP ″cbgl..kmmc ″in d :\tem p \ 2c 2S ″ysun ″2U ″sa ″2P ″″从指定目录恢复数据,恢复数据是累加操作。
Delphi 执行MS 2DOS 外部程序的方法主要用WinExec 或ShellExecute ,读者可参阅相关资料,这里
就不做更多介绍。
以上方法仅做些简单实用的介绍,具体涉及的参数和采用的方法还可以有很多,有兴趣的话可参阅相关书籍。
参考文献:
[1] 飞思科技产品研发中心.开发专家之Delphi 6编程指南
[M].北京:电子工业出版社,2002.
[2] 梁嘉超,卢山,夏运强.ASP 后台数据库网站制作实例经
典[M].北京:冶金工业出版社,2001.
(上接第79页)
2 结束语
对以上四种实现串行通信的方法加以比较,可以得到以下结论:调用Windows API 函数来实现串行通信可以设计和开发出各种功能强大的通信软件,然而比较复杂,要求掌握大量相关知识。利用控件编程比较简单,只要设定好属性,使用好方法和事件就可以成功实现串行通信,编程人员容易掌握。嵌
入汇编方法执行速度很快,但程序的可读性和可维护性比较差。如果编程人员精通其他编程语言,那么调用D LL
来实现串行通信也不失为一个好方法。以上方法均在Windows 98+Delphi 5环境下验证通过。
参考文献:
[1] [美]S teve T eixeira ,X avier Pacheeo.Delphi 4开发大全[M].
北京:人民邮电出版社,1999.
[2] 黄军,等.Delphi 串口通信编程[M].北京:人民邮电出版
社,2001.
[3] 沈美明,等.I BM PC 汇编语言程序设计[M].北京:清华
大学出版社,1998.
28计 算 机 与 现 代 化2003年第5期

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。