如何在delphi中使用mssqlserver的sql-dmo进行数据库备份与恢复? (200分)

  • 主题发起人 主题发起人 bloodbird
  • 开始时间 开始时间
B

bloodbird

Unregistered / Unconfirmed
GUEST, unregistred user!
如何在delphi中使用mssqlserver的sql-dmo进行数据库备份与恢复?
 
可以用动态别名 + 存储过程来执行数据库的备份与恢复。
 
看我的几个相关函数(要耐心)
// check server ÊÇ·ñ´æÔÚ
function checkserver(servername:string):boolean;
var
app:_application;
nl:namelist ;
i:integer;
begin
result:=false;
app:=coapplication.Create;
nl:=app.ListAvailableSQLServers;
for i:=0 to nl.Count-1 do
begin
if uppercase(nl.Item(i+1))=uppercase(servername) then
begin
result:=true;
break;
end;
end;


end;


// check database
function checkdatabase(servername,databasename,username,password:string):boolean;
var
server:_sqlserver;
i:integer;
begin
result:=false;
if not checkserver(servername) then
begin
application.MessageBox(pchar('Êý¾Ý¿â·þÎñÆ÷'+servername+'²»´æÔÚ'), pchar('ÌáʾÐÅÏ¢'), MB_OK or MB_ICONINFORMATION);
exit;
end;
server:=cosqlserver.Create;
server.LoginTimeout:=-1;
With Server do
begin
LoginSecure := False;
AutoReConnect := False;
try
Connect(servername,username,password);
except
forms.application.MessageBox(pchar('Óû§Ãû»ò¿ÚÁîÓÐÎó'), pchar('ÌáʾÐÅÏ¢'), MB_OK or MB_ICONINFORMATION);
exit;
end;
end;
for i:=1 to server.Databases.Count do
begin
if uppercase(server.Databases.Item(i,'').Name)=uppercase(databasename) then
begin
result:=true;
break;
end;
end;
if not result then application.MessageBox(pchar('Êý¾Ý¿â '+databasename+'²»´æÔÚ'), pchar('ÌáʾÐÅÏ¢'), MB_OK or MB_ICONINFORMATION);

end;

//sql server backup database
function backupdatabase(servername,databasename,username,password,filename:string):boolean;
var
server:_sqlserver;
Backup :_Backup;

begin
result:=false;
if not checkdatabase(servername,databasename,username,password) then
begin
exit;
end;
server:=cosqlserver.Create;
server.LoginTimeout:=-1;
With Server do
begin
LoginSecure := False;
AutoReConnect := False;
Connect(servername,username,password);
end;
Backup :=coBackup.Create ;
backup.Database:=databasename;
Backup.Files := filename;
Screen.Cursor:= crHourGlass;
try
backup.SQLBackup(server);
Screen.Cursor := crDefault;
forms.application.MessageBox(pchar('Êý¾Ý¿â '+databasename+' ±¸·Ý³É¹¦'), pchar('Êý¾Ý¿â±¸·Ý'), MB_OK or MB_ICONINFORMATION);

result:=true;
except
Screen.Cursor := crDefault;
forms.application.MessageBox(pchar('Êý¾Ý¿â '+DatabaseName+' ±¸·Ýʧ°Ü'), pchar('Êý¾Ý¿â±¸·Ý'), MB_OK or MB_ICONINFORMATION);

end;


end;


//sql server restore database
function restoredatabase(servername,databasename,username,password,filename:string):boolean;
var
server:_sqlserver;
Restore :_Restore;
begin
result:=false;
server:=cosqlserver.Create;
server.LoginTimeout:=-1;
With Server do
begin
LoginSecure := False;
AutoReConnect := False;
Connect(servername,username,password);
end;
Restore :=coRestore.create;
Restore.Database :=DatabaseName;
Restore.Replacedatabase:=true;
Restore.action:=SQLDMORESTORE_DATABASE;
Restore.Files := filename;
try
Screen.Cursor := crHourGlass;
Restore.SQLRestore(server);
Screen.Cursor := crDefault;
application.MessageBox(pchar('Êý¾Ý¿â '+DatabaseName+' »Ö¸´³É¹¦'), pchar('Êý¾Ý¿â»Ö¸´'), MB_OK or MB_ICONINFORMATION);

except
Screen.Cursor := crDefault;
application.MessageBox(pchar('Êý¾Ý¿â '+DatabaseName+' »Ö¸´Ê§°Ü'), pchar('Êý¾Ý¿â»Ö¸´'), MB_OK or MB_ICONINFORMATION);

end;

end;


//get servername from connectionstring
function getservername(connectionstring:string):string;
var
tmp,s:string;
begin
s:=connectionstring;
while pos(';',s)>0 do
begin
tmp:=copy(s,1,pos(';',s));
s:=copy(s,pos(';',s)+1,length(s)-pos(';',s));
if pos(uppercase('Data Source='),uppercase(tmp))>0 then
begin
result:=copy(tmp,pos('=',tmp)+1,length(tmp)-pos('=',tmp)-1);
exit;
end;
end;
tmp:=s;
if pos(uppercase('Data Source='),uppercase(tmp))>0 then
begin
result:=copy(tmp,pos('=',tmp)+1,length(tmp)-pos('=',tmp)-1);

end;
end;
//get databasename from connectionstring
function getdatabasename(connectionstring:string):string;
var
tmp,s:string;
begin
s:=connectionstring;
while pos(';',s)>0 do
begin
tmp:=copy(s,1,pos(';',s));
s:=copy(s,pos(';',s)+1,length(s)-pos(';',s));
if pos(uppercase('Initial Catalog='),uppercase(tmp))>0 then
begin
result:=copy(tmp,pos('=',tmp)+1,length(tmp)-pos('=',tmp)-1);
exit;
end;
end;
tmp:=s;
if pos(uppercase('Initial Catalog='),uppercase(tmp))>0 then
begin
result:=copy(tmp,pos('=',tmp)+1,length(tmp)-pos('=',tmp)-1);

end;
end;
//get username from connectionstring
function getusername(connectionstring:string):string;
var
tmp,s:string;
begin
s:=connectionstring;
while pos(';',s)>0 do
begin
tmp:=copy(s,1,pos(';',s));
s:=copy(s,pos(';',s)+1,length(s)-pos(';',s));
if pos(uppercase('User ID='),uppercase(tmp))>0 then
begin
result:=copy(tmp,pos('=',tmp)+1,length(tmp)-pos('=',tmp)-1);
exit;
end;
end;
tmp:=s;
if pos(uppercase('User ID='),uppercase(tmp))>0 then
begin
result:=copy(tmp,pos('=',tmp)+1,length(tmp)-pos('=',tmp)-1);

end;
end;
//get password from connectionstring
function getpassword(connectionstring:string):string;
var
tmp,s:string;
begin
s:=connectionstring;
while pos(';',s)>0 do
begin
tmp:=copy(s,1,pos(';',s));
s:=copy(s,pos(';',s)+1,length(s)-pos(';',s));
if pos(uppercase('Password='),uppercase(tmp))>0 then
begin
result:=copy(tmp,pos('=',tmp)+1,length(tmp)-pos('=',tmp)-1);
exit;
end;
end;
tmp:=s;
if pos(uppercase('Password='),uppercase(tmp))>0 then
begin
result:=copy(tmp,pos('=',tmp)+1,length(tmp)-pos('=',tmp)-1);

end;
end;
 
怎么会有乱码啊?
 
我在CODELHPI发的一篇帖子,可能对你用。内容如下:
《愿意加分就加分,不要仍砖头啊。。:)》
多层架构(MTS/COM+)应用系统的最终分发
====================================================

本人用DELPHI开发出三层系统之后,专注于分发程序时碰到一系列的问题,如最终客户安装MTS/COM+组件、安装数据库系统,导入应用系统的数据库,以及让最终用户灵活设置MTS/COM+组件连接的数据库,和让最终用户使用客户端应用程序灵活设置连接安装MTS/COM+服务器组件的服务器以及设置通过某种方式连接(局域网告诉连接<DCOM连接>或远程SOCKET连接)等等。这些问题的处理的好坏将直接影响到系统是否被最终用户接受,经过我多次实验终于想出一套解决的办法,不敢说是最好的,但是也足够让你的系统安装被用户最低程度的接受。
我的开发环境(WIN2000PRO+DELPHI6 +SQL SERVER7.0)
一、系统本身的开发。
1、开发MTS/COM+组件时所做的:
为了程序的通用性,为接口开发一数据库设置方法,这是为使系统管理员设置组件连接的数据库服务器和数据库以及连接用户和密码(同时考虑设置程序的加密),方法传递参数有,数据库服务器名,数据库名,数据库连接用户,密码,设置密码,返回成功标志值.
2、为组件编写事件,当数据库进行连接之前取得数据库连接参数。
3、为组件接口编写一数据库设置正确标志,返回正确标志。
二、开发客户端时所做:
1、用户在登陆时,最终用户可以进行设置连接方式使用DCOM或SOCKET 连接,设置连接服务器参数。
2、连接之后,取数据库连接标志。
三、数据库准备
1、使用SQL语句备份系统所需的数据库寸为数据库备份文件,SQL语句如下:
BACKUP DATABASE [你的数据库名] TO DISK='[你保存数据库备份文件的目录]' WITH PASSWORD='[你的密码]'
这里加上PASSWORD关键字是为了保证数据库不被手工恢复以及破解
四、编写组件数据库连接应用程序。调用组件中方法。
五、制作数据库恢复模块,使用SQL语句:
RESTORE DATABASE [你的数据库名] FROM DISK='[你的数据库备份文件目录]'
WITH
MOVE '[数据库数据名]'='数据库数据文件存盘地址',
'[数据库日志名]'='数据库记录文件存盘地址'
PASSWORD='[你设置的数据库备份文件密码]'
六、制作安装程序
服务器安装模块:在安装程序中调用组件方法设置数据库连接,调用数据库恢复模块。
安装完成
客户端安装模块

以上为我自己编写,调试成功,并安装测试成功。希望对大家有用,如还有其他更好的分发方法和对我的分发方法有什么意见和建议请EMAIL至:boyku@sina.com
谢谢!
游星 2001.11.05
 
乱码是我的提示信息,不影响程序的
我以前用存储过程,备份可以,但是恢复是提示我库已打开,要我关闭
可是关闭后又没法执行存储过程,所以就改用sql-dmo了
如果有问题,抓紧时间,我明天要出差了,要半个月不能来DFW了
 
antic_ant, 我把它打包到数据库安装到客户短需要注意什么啊啊,怎么会提示我没装
sql-dmo? 我明明把sql-dmo.dll打包进去了啊
 
ohyee,您能告诉我您在codelphi中发的帖子的链接吗?我找的头晕脑涨还没找到
 
我还没做打包程序,以前我是让用户安装sqlserver的
不过可以找以前的贴子,打包时只要把几个dll打进去就可了
查查吧
 
antic_ant: 我将sql-dmo import type libary后, 执行发现 application不能用了
该怎么解决阿? 你还在吗?
 
多人接受答案了。
 
后退
顶部