摘 要 介绍了用Delphi语言操作SQL Server数据库,实现对已有表字段的增加及数据库的备份和恢复。
关键词 VPN,端口影射,表更新
一、概述
数据库应用系统开发完成后,发布和使用前需要要了解后台数据库网络连接方式和具体的配置方法,因为客户实际的网络环境各不相同。一般客户端软件运行在局域网环境下,也有的客户终端不在本地,可以通过VPN和SQL Server 端口影射方法连接到数据库服务器。VPN是虚拟专用网的简称,利用公网(Internet)资源实现端对端的访问,这种方式客户端就像在局域网里一样地访问和操作数据库服务器。实际使用过程中也有通过路由器端口影射的方法,将SQL Server默认端口影射到内部局域网数据库服务器上,客户端通过公网IP地址(路由器地址)访问和操作数据库服务器。下面从两个方面来论述应用数据库的维护。
二、数据库表更新升级
在实际的应用软件使用过程中,由于业务上新需求的变化,客户会在功能方面提出新的要求,这样客户端软件就需要增加新的功能来满足用户的要求。如在客户端软件中要加入数据库表升级的功能。下面用实际使用的数据库表升级过程来描述。首先查询要新增的字段在指定数据库表是否存在,如果不存在,使用ALTER TABLE命令新增字段。该升级功能由一个查询函数和一个升级过程来完成。
function find_field(tname,tfield: string): boolean;
var
i: integer;
begin
result := false;
dmsw.adqupgrade.TableName := tname;
dmsw.adqupgrade.Active := true;
for i := 0 to dmsw.adqupgrade.FieldCount-1 do
begin
if dmsw.adqupgrade.Fields[i].FieldName=tfield then
begin
result := true;
dmsw.adqupgrade.Active := false;
exit;
end;
end;
dmsw.adqupgrade.Active := false;
end;
对两个数据库表添加字段,并指定字段名称、数据类型、数据长度。
procedure database_upgrade();
var
j,i: integer;
tname: array [0..2] of string;
begin
tname[0] := 'meter_model';
tname[1] := 'customer';
TRY
dmsw.ADCServer.BeginTrans;
for i := 0 to 1 do
begin
case i of
0:
begin
if not find_field(tname[i],'produceplace') then
begin
dmsw.adcupdatetable.CommandText := 'ALTER TABLE water_meter_model ADD produceplace VARCHAR(50) NULL';
dmsw.adcupdatetable.Execute;
end;
end;
1:
begin
if not find_field(tname[i],'customer_num') then
begin
dmsw.adcupdatetable.CommandText := 'ALTER TABLE customer ADD customer_num VARCHAR(20) NULL';
dmsw.adcupdatetable.Execute;
end;
if not find_field(tname[i],'customer_memo') then
begin
dmsw.adcupdatetable.CommandText := 'ALTER TABLE customer ADD customer_memo VARCHAR(30) NULL';
dmsw.adcupdatetable.Execute;
end;
end;
end;
end;
dmsw.ADCServer.CommitTrans;
EXCEPT
dmsw.ADCServer.RollbackTrans;
END;
end;
三、数据库备份与恢复
应用数据库备份与恢复是数据安全性的重要保障,可以有多种方法实现该功能,SQL Server企业管理中具有数据库备份和还原操作的功能,数据库管理员可以通过后台完成数据库的维护。操作员也可以在客户端完成数据库的备份和恢复操作,这需要我们通过客户端程序来完成。下面介绍用Delphi 程序实现SQL Server数据库的备份和恢复功能,设计思路是用SQL Server的“Backup Database”和“Restore Database”两个命令,在功能操作中建立两个线程来实现备份命令和恢复命令。
1.数据库备份

图1 备份数据库窗体
备份窗体中可以让用户选择备份的目录,备份文件的格式可以这样定义:数据库名称+yyyy-mm-dd_hhnn,扩展名.dat。(如mydata2006-06-12_1405.Dat。)备份事件中按文件名生成备份命令串,并创建备份线程,在线程中执行备份命令。核心代码描述如下:
......
sqlstr := trim(Edit3.Text); //备份文件名称
try
with dmsw.adqbaksql do begin
close;
sql.Clear;
sql.Text := 'BACKUP DATABASE HL_SGMS '+'TO DISK='+''''+sqlstr+'''';
Err:=false;
esql:=true;
bakthread := Tbakthread.Create(true);
bakthread.Resume;
while esql do application.ProcessMessages;
if not Err then
application.MessageBox(pchar('数据备份成功!'),'
备份',MB_ok+MB_ICONInformation)
else
application.MessageBox(pchar('备份失败!'+chr(13)+ErrDes),'备份',MB_ok+MB_ICONwarning);
end;
except
on EOleException do begin
showmessage('操作失败,请确认当前没有对数据库进行添加删除数据操作!');
end;
else
raise;
end;
......
执行命令线程
procedure Tbakthread.Execute;
begin
{ Place thread code here }
dmsw.adqbaksql.ExecSQL;
if dmsw.adqbaksql.Connection.Errors.Count>0 then begin
errdes:=dmsw.adqbaksql.Connection.Errors.Item[0].Get_Description;
Err:=true; //调用备份窗口错误处理
end;
esql := false;
end;
2.数据库恢复

图2 数据库恢复窗体
在恢复窗体中选择要恢复的备份文件名,执行数据库恢复命令,核心代码如下:
try
if fileexists(trim(edit3.Text)) then begin //要恢复的备份文件是否存在
if application.MessageBox(pchar('恢复操作将会覆盖现有数据,请确认是否真的要进行恢复?)'+chr(13)+
`(恢复数据前请确保只有一个用户在使用当前软件)`)`,`恢复',MB_OKCancel+MB_ICONInformation)=idok then
with dmsw.adqrestore do
begin
close;
sql.Clear;
sql.Add('use master');
sql.Add('Restore Database hl_sgms'+' from disk='''+trim(edit3.Text)+''' with REPLACE');
sql.Add('use hl_swms');
Err:=false;
Exec:=true;
restoredata:=Trestoredata.Create(true);
restoredata.Resume;
while exec do application.ProcessMessages;
if not Err then
application.MessageBox(pchar('数据恢复成功!'),'恢复',MB_ok+MB_ICONInformation)
else
application.MessageBox(pchar('恢复失败!'+chr(13)+ErrDes),'恢复',MB_ok+MB_ICONwarning);
end;
end;
panel1.BringToFront;
except
end;
执行命令线程
procedure Trestoredata.Execute;
begin
{ Place thread code here }
try
dmsw.adqrestore.ExecSQL;
if dmsw.adqrestore.Connection.Errors.Count>0 then begin
ErrDes:=dmsw.adqrestore.Connection.Errors.Item[0].Get_Description;
Err:=true;
end;
finally
Exec:=false;
end;
end;
四、结语
数据库应用系统在使用过程中,客户端会提出新的需求,新增功能模块可能要求程序对后台数据库进行维护,包括新增业务表、修改数据表、新增存储过程、数据库备份和数据库恢复功能等。所以,掌握SQL Server常用的数据库维护命令是必要的。
|