实时备份SQL数据库

时间:2022-09-14 00:02:08
当数据库里有改变或有操作时,就备份到U盘上。

10 个解决方案

#1


没做过,以前做的都是手工备份。up

#2


可以自己写一个事件,每当有数据变动的时候就把数据增量备份到目标设备上就可以了

#3


只做过定时备份,实时的没做过。实时的也没什么实际价值。
数据库一有攺变或操作时就自动备份,那计算机没时间干其他的了!

#4


unit UnitBackup;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Db,ADODB, ExtCtrls, ShellApi, Menus,
  ComCtrls, Registry, ScktComp , StdCtrls , Buttons,  Variants,IniFiles ,StrUtils,
  ImgList ;

 const
  WM_BARICON=WM_USER+200; //自定义消息
  ID_MAIN=100;//定义图标的ID
type
  TFrmBackup = class(TForm)
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    CmbServerName: TComboBox;
    CmbDatabaseName: TComboBox;
    EdtUserName: TEdit;
    EdtPassword: TEdit;
    GroupBox2: TGroupBox;
    GroupBox3: TGroupBox;
    btnSave: TBitBtn;
    btnCancel: TBitBtn;
    cboAutoRun: TCheckBox;
    EdtPath: TEdit;
    btnPath: TButton;
    btnSetTime: TBitBtn;
    connAdo: TADOConnection;
    connQuery: TADOQuery;
    btnBackup: TBitBtn;
    Timer1: TTimer;
    cboShowMessage: TCheckBox;
    PopupMenu: TPopupMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    ImageList1: TImageList;
    cboMin: TCheckBox;
    cboClose: TCheckBox;
    cboStart: TCheckBox;
    BitBtn1: TBitBtn;
    procedure btnSetTimeClick(Sender: TObject);
    procedure btnSaveClick(Sender: TObject);
    procedure btnBackupClick(Sender: TObject);
    procedure btnPathClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure btnCancelClick(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure N1Click(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
    FilePath:String;
    BackupIniFile:TIniFile;
    ServerName,DatabaseName,UserName,Password:String;

    Run,StartMin,Show,Min,CloseShow:integer;
    Conn:Boolean;  //判断联接是否成功
    connString:String; //联接字符串
    BackFileName:String; //备份文件的名称
    procedure AddIcon(hwnd:HWND);
    procedure RemoveIcon(hwnd: HWND); //从状态区移去图标

    procedure WMSysCommand(var Message: TMessage); message WM_SYSCOMMAND;
    procedure WMBarIcon(var Message:TMessage);message WM_BARICON;
    procedure WMMini(var Message:TMessage);message WM_SETFOCUS;
    procedure BackupBase(FileName:String); //定义备份过程
    procedure ReadIni; //读取INI文件中的内容
  public
    { Public declarations }
    BackupType,EveryTime,EveryDay,EveryMonth,EveryWeek:integer;
  end;

var
  FrmBackup: TFrmBackup;
implementation

uses UnitFrmSetupTime, UnitFilePath, UnitDirPath, UnitDlg;

{$R *.dfm}
procedure TFrmBackup.AddIcon(hwnd:HWND);
var
  lpData:PNotifyIconData;
begin
  lpData := new(PNotifyIconDataA);
  lpData.cbSize := 88;
  lpData.Wnd := FrmBackup.Handle;
  lpData.hIcon := FrmBackup.Icon.Handle;
  lpData.uCallbackMessage := WM_BARICON;
  lpData.uID :=0;
  lpData.szTip := '数据库备份工具';
  lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
  Shell_NotifyIcon(NIM_ADD,lpData);
  dispose(lpData);
  FrmBackup.Visible := False;
end;

procedure TFrmBackup.RemoveIcon(hwnd: HWND);//从状态区移去图标
var
  lpData:PNotifyIconData;
begin
  //如果用户点击任务栏图标则将图标删除并回复窗口。
  lpData := new(PNotifyIconDataA);
  lpData.cbSize := 88;//SizeOf(PNotifyIconDataA);
  lpData.Wnd := FrmBackup.Handle;
  lpData.hIcon := FrmBackup.Icon.Handle;
  lpData.uCallbackMessage := WM_BARICON;
  lpData.uID :=0;
  lpData.szTip := 'Samples';
  lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
  Shell_NotifyIcon(NIM_DELETE,lpData);
  dispose(lpData);
end;

procedure TFrmBackup.WMSysCommand(var Message:TMessage);
begin
  if Message.WParam = SC_ICON then
  begin
     //如果用户最小化窗口则将窗口
     //隐藏并在任务栏上添加图标
     AddIcon(handle);
  end
  else if (Message.WParam= SC_Close) and (Min=1)then begin
      Application.Minimize;
      AddIcon(handle);
  end
  else if (Message.WParam=WM_CREATE) and (Min=1)then begin
      Application.Minimize;
      AddIcon(handle);
  end
  else
     //如果是其它的SystemCommand
     //消息则调用系统缺省处理函数处理之。
     DefWindowProc(FrmBackup.Handle,Message.Msg,Message.WParam,Message.LParam);
end;

procedure TFrmBackup.WMBarIcon(var Message:TMessage);
var
   lpData:PNotifyIconData;
   Pt:TPoint;
begin
  if (Message.LParam = WM_LBUTTONDOWN) then
   begin
     RemoveIcon(handle);
     FrmBackup.Visible := True;
   end
   else if (Message.LParam=WM_RBUTTONDOWN) then
   begin
     SetForeGroundWindow(lpData.Wnd);
     GetCursorPos(Pt);
     Popupmenu.Popup(Pt.X,pt.y);
   end;
end;

procedure TFrmBackup.WMMini(var Message:TMessage);
begin
  if (Message.Msg=WM_CREATE) then begin
      Application.Minimize;
      AddIcon(handle);
  end
end;

//定义备份过程
procedure TFrmBackup.BackupBase(FileName:String);
begin
  try
    screen.Cursor:=crSqlWait;
    with connQuery do
    begin
      close;
      Sql.Text:='Backup Database '+Trim(CmbDatabaseName.Text)+' to Disk='''+FileName+''' ';
      ExecSQL;
    end;
    screen.Cursor:=crDefault;
  except
    MessageBox(handle,'备份失败!','提示',MB_IconWarning+mb_Ok);
    screen.Cursor:=crDefault;
    Exit;
  end;
end;

//读取INI文件中的内容
procedure TFrmBackup.ReadIni;
begin
  FilePath:=ExtractFilePath(Application.ExeName)+'System.ini';
  BackupIniFile:=TIniFile.Create(FilePath);
  ServerName:=BackupIniFile.ReadString('Database','ServerName','');
  DatabaseName:=BackupIniFile.ReadString('Database','DatabaseName','');
  UserName:=BackupIniFile.ReadString('Database','UserName','');
  Password:=BackupIniFile.ReadString('Database','Password','');
  Run:=BackupIniFile.ReadInteger('AutoRun','Run',0);
  StartMin:=BackupIniFile.ReadInteger('AutoRun','StartMin',0); 
  Show:=BackupIniFile.ReadInteger('AutoRun','Show',0);
  Min:=BackupIniFile.ReadInteger('AutoRun','Min',0);
  CloseShow:=BackupIniFile.ReadInteger('AutoRun','CloseShow',0);

  BackupType:=BackupIniFile.ReadInteger('Backup','BackupType',0);
  EveryTime:=BackupIniFile.ReadInteger('Backup','EveryTime',0);
  EveryDay:=BackupIniFile.ReadInteger('Backup','EveryDay',0);
  EveryWeek:=BackupIniFile.ReadInteger('Backup','EveryWeek',0);
  EveryMonth:=BackupIniFile.ReadInteger('Backup','EveryMonth',0);

  CmbServerName.Text:=ServerName;
  CmbDatabaseName.Text:=DatabaseName;
  EdtUserName.Text:=UserName;
  EdtPassword.Text:=Password;
  EdtPath.Text:=BackupIniFile.ReadString('FilePath','Path','');
  
  if Run=1 then  //初始化<随开机启动>
    cboAutoRun.Checked:=True
  else
    cboAutoRun.Checked:=False;
  if StartMin=1 then //初始化<启动后最小化>
    cboStart.Checked:=True
  else
    cboStart.Checked:=False;
  if Show=1 then //初始化<备份时显示提示信息>
    cboShowMessage.Checked:=True
  else
    cboShowMessage.Checked:=False;
  if Min=1 then  //初始化<关闭时最小化>
    cboMin.Checked:=True
  else
    cboMin.Checked:=False;
  if CloseShow=1 then  //初始化<不显示关闭信息>
    cboClose.Checked:=True
  else
    cboClose.Checked:=False;
end;

procedure TFrmBackup.btnSetTimeClick(Sender: TObject);
begin
  Application.CreateForm(TFrmSetupTime,FrmSetupTime); 
  FrmSetupTime.ShowModal;
  FrmSetupTime.Free;
end;

#5


procedure TFrmBackup.btnSaveClick(Sender: TObject);
var
  reg:TRegistry;
  S_RegTree:String;
begin
  if not conn then //判断数据库联接是否成功,只有成功之后才能保存
  begin
    MessageBox(handle,'数据库联接没有成功,所以不能保存!','错误',mb_IconWarning+mb_Ok);
    CmbServerName.SetFocus;
    Exit;
  end;
  //将数据库联接参数保存到Ini文件中
  BackupIniFile.WriteString('Database','ServerName',Trim(CmbServername.Text));
  BackupIniFile.WriteString('Database','DatabaseName',Trim(CmbDatabaseName.Text));
  BackupIniFile.WriteString('Database','UserName',Trim(EdtUserName.Text));
  BackupIniFile.WriteString('Database','Password',Trim(EdtPassword.Text));
  BackupIniFile.WriteString('FilePath','Path',Trim(EdtPath.Text));
  //判断是否开机时起动系统
  reg:=tregistry.Create;
  Reg.RootKey:=HKEY_LOCAL_MACHINE;
  S_RegTree:='\Software\Microsoft\Windows\CurrentVersion\Run';
  if Reg.OpenKey(S_RegTree,False)=false then
    Reg.CreateKey(S_RegTree);
  Reg.OpenKey(S_RegTree,True);
  FilePath:=ExtractFilePath(Application.ExeName)+'Backup.exe';

  if cboAutoRun.Checked then
  begin
    Reg.WriteString('BackupDatabase',FilePath);
    BackupIniFile.WriteInteger('AutoRun','Run',1);
  end
  else begin
    Reg.DeleteValue('BackupDatabase');
    BackupIniFile.WriteInteger('AutoRun','Run',0);
  end;
  //启动后最小化
  if cboStart.Checked then
    BackupIniFile.WriteInteger('AutoRun','StartMin',1)
  else
    BackupIniFile.WriteInteger('AutoRun','StartMin',0);
  //<备份时显示提示信息>
  if cboShowMessage.Checked then
    BackupIniFile.WriteInteger('AutoRun','Show',1)
  else
    BackupIniFile.WriteInteger('AutoRun','Show',0);
  //<关闭时最小化>
  if cboMin.Checked then
    BackupIniFile.WriteInteger('AutoRun','Min',1)
  else
    BackupIniFile.WriteInteger('AutoRun','Min',0);
  //<显示关闭信息>
  if cboClose.Checked then
    BackupIniFile.WriteInteger('AutoRun','CloseShow',1)
  else
    BackupIniFile.WriteInteger('AutoRun','CloseShow',0);
  Reg.Free;
  ReadIni();
end;

procedure TFrmBackup.btnBackupClick(Sender: TObject);
var
  FilePath:String;
begin
  try
    if Show=1 then begin
      application.CreateForm(tfrmDlg,frmDlg);
      frmDlg.Show;
    end;

    //文件名等于<年月日时分秒>
    BackFileName:=Trim(CmbDatabaseName.Text)+FormatDateTime('yyyymmddhhmmss',Now); //取得备份文件名
    //取得地址框中的地址
    if RightStr(EdtPath.text,1)='\' then
       FilePath:=EdtPath.Text
    else
       FilePath:=EdtPath.Text+'\';

    FilePath:=FilePath+BackFileName;
    screen.Cursor:=crSqlWait;
    BackupBase(FilePath); //调用备份过程备份文件
    screen.Cursor:=crDefault;
    if Show=1 then
    begin
      frmDlg.Close;
      frmDlg.Free;
    end;
  except
    MessageBox(handle,'备份失败!','提示',MB_IconWarning+mb_Ok);
    screen.Cursor:=crDefault;
    Exit;
  end;
end;


procedure TFrmBackup.btnPathClick(Sender: TObject);
begin
  Application.CreateForm(TFrmDirPath,FrmDirPath); 
  if FrmDirPath.ShowModal=mrOk then
    EdtPath.Text:=FrmDirPath.DirectoryListBox1.Directory;
end;

procedure TFrmBackup.Timer1Timer(Sender: TObject);
var
  Year,Month,Day,Hour,Min,Sec,MSec:Word;
begin
  DecodeDate(Now,Year,Month,Day);
  DecodeTime(Now, Hour, Min, Sec, MSec);

  case BackupType of
  0:begin//不备份
      //
    end;
  1:begin//每小时
      if (Min=EveryTime) and (Sec=0) then
        btnBackupClick(btnBackup);
    end;
  2:begin//每天
      if (Hour=EveryDay) and (Min=EveryTime) and (Sec=0) then
        btnBackupClick(btnBackup);
    end;
  3:begin//每周
      if ((DayOfWeek(Date)-1)=EveryWeek) and (Hour=EveryDay) and (Min=EveryTime) and (Sec=0) then
        btnBackupClick(btnBackup);
    end;
  4:begin//每月
      if (Day=EveryMonth) and (Hour=EveryDay) and (Min=EveryTime) and (Sec=0) then
        btnBackupClick(btnBackup);
    end;
  end;

end;

procedure TFrmBackup.FormCreate(Sender: TObject);
begin
  ReadIni();
  connString:='Driver={SQL server};server='+Trim(CmbServerName.Text)+';database='+Trim(CmbDatabaseName.Text)+
              ';uid='+Trim(EdtUserName.Text)+';pwd='+Trim(EdtPassword.Text);
  try
    connAdo.ConnectionString:=connString;
    connAdo.LoginPrompt:=False;
    connAdo.Connected:=True;
    conn:=True;
  except
    MessageBox(handle,'联接数据库错误','错误',mb_IconWarning+mb_Ok);
    Exit;
  end;

  //取得服务器中所有数据库名
  with connQuery do
  begin
    Close;
    Sql.Text:='select * from master.dbo.sysdatabases';
    open;
    while not Eof do
    begin
      cmbDatabaseName.Items.Add(Fields[0].Value);
      next;
    end;
  end;
  //判断启动时是否最小化窗体
 { if StartMin=1 then
  begin
    //Application.Minimize;
    AddIcon(handle);
  end;  }
end;

procedure TFrmBackup.btnCancelClick(Sender: TObject);
begin
  //取消所做的修改
  ReadIni();
end;

procedure TFrmBackup.N2Click(Sender: TObject);
begin
  close;
end;

procedure TFrmBackup.N1Click(Sender: TObject);
begin
  FrmBackup.Visible := True;
end;

procedure TFrmBackup.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
begin
  if CloseShow=1 then
  begin
    if MessageBox(Handle,'确实要关闭系统吗?','提示',MB_YESNO+MB_ICONINFORMATION)=IDNO then
    begin
      canClose:=False;
    end
    else
    begin
      RemoveIcon(handle);
      Application.Terminate ;
    end;
  end
  else begin
    RemoveIcon(handle);
    Application.Terminate ;
  end;
end;

procedure TFrmBackup.BitBtn1Click(Sender: TObject);
begin
  if Trim(CmbServerName.Text)='' then
  begin
    MessageBox(handle,'数据库服务器名称不能为空!','错误',mb_IconWarning+mb_Ok);
    CmbServerName.SetFocus;
    Exit;
  end;
  if Trim(CmbDatabaseName.Text)='' then
  begin
    MessageBox(handle,'数据库名称不能为空!','错误',mb_IconWarning+mb_Ok);
    CmbDatabaseName.SetFocus;
    Exit;
  end;
  if Trim(EdtUserName.Text)='' then
  begin
    MessageBox(handle,'用户名不能为空!','错误',mb_IconWarning+mb_Ok);
    EdtUserName.SetFocus;
    Exit;
  end;
  connString:='Driver={SQL server};server='+Trim(CmbServerName.Text)+';database='+Trim(CmbDatabaseName.Text)+
              ';uid='+Trim(EdtUserName.Text)+';pwd='+Trim(EdtPassword.Text);
  try
    screen.Cursor:=crSqlwait;
    with connAdo do
    begin
      if Connected then
         Connected:=False;
      ConnectionString:=connString;
      LoginPrompt:=False;
      Connected:=True;
    end;
    MessageBox(handle,'联接成功!','提示',MB_ICONINFORMATION+mb_Ok);
    conn:=True;
    screen.Cursor:=crdefault;
  except
    MessageBox(handle,'联接失败!','提示',mb_IconWarning+mb_Ok);
    screen.Cursor:=crdefault;
    conn:=False;
    Exit;
  end;
end;

end.

#6


so 长!

#7


建议你多看看SQLSERVER的资料,可以通过日志备份

#8


sql server本身即有自动增量备份

#9


有增量备份这个功能,看看帮助吧,或者搜搜sql server版的相关文章

#10


不是说SQLSERVER有日志文件吗?那还需要什么实时备份啊!定时的足够了!
如果是三层结构最多加个错误信息处理机制,或者加个缓冲区

#1


没做过,以前做的都是手工备份。up

#2


可以自己写一个事件,每当有数据变动的时候就把数据增量备份到目标设备上就可以了

#3


只做过定时备份,实时的没做过。实时的也没什么实际价值。
数据库一有攺变或操作时就自动备份,那计算机没时间干其他的了!

#4


unit UnitBackup;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Db,ADODB, ExtCtrls, ShellApi, Menus,
  ComCtrls, Registry, ScktComp , StdCtrls , Buttons,  Variants,IniFiles ,StrUtils,
  ImgList ;

 const
  WM_BARICON=WM_USER+200; //自定义消息
  ID_MAIN=100;//定义图标的ID
type
  TFrmBackup = class(TForm)
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    CmbServerName: TComboBox;
    CmbDatabaseName: TComboBox;
    EdtUserName: TEdit;
    EdtPassword: TEdit;
    GroupBox2: TGroupBox;
    GroupBox3: TGroupBox;
    btnSave: TBitBtn;
    btnCancel: TBitBtn;
    cboAutoRun: TCheckBox;
    EdtPath: TEdit;
    btnPath: TButton;
    btnSetTime: TBitBtn;
    connAdo: TADOConnection;
    connQuery: TADOQuery;
    btnBackup: TBitBtn;
    Timer1: TTimer;
    cboShowMessage: TCheckBox;
    PopupMenu: TPopupMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    ImageList1: TImageList;
    cboMin: TCheckBox;
    cboClose: TCheckBox;
    cboStart: TCheckBox;
    BitBtn1: TBitBtn;
    procedure btnSetTimeClick(Sender: TObject);
    procedure btnSaveClick(Sender: TObject);
    procedure btnBackupClick(Sender: TObject);
    procedure btnPathClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure btnCancelClick(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure N1Click(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
    FilePath:String;
    BackupIniFile:TIniFile;
    ServerName,DatabaseName,UserName,Password:String;

    Run,StartMin,Show,Min,CloseShow:integer;
    Conn:Boolean;  //判断联接是否成功
    connString:String; //联接字符串
    BackFileName:String; //备份文件的名称
    procedure AddIcon(hwnd:HWND);
    procedure RemoveIcon(hwnd: HWND); //从状态区移去图标

    procedure WMSysCommand(var Message: TMessage); message WM_SYSCOMMAND;
    procedure WMBarIcon(var Message:TMessage);message WM_BARICON;
    procedure WMMini(var Message:TMessage);message WM_SETFOCUS;
    procedure BackupBase(FileName:String); //定义备份过程
    procedure ReadIni; //读取INI文件中的内容
  public
    { Public declarations }
    BackupType,EveryTime,EveryDay,EveryMonth,EveryWeek:integer;
  end;

var
  FrmBackup: TFrmBackup;
implementation

uses UnitFrmSetupTime, UnitFilePath, UnitDirPath, UnitDlg;

{$R *.dfm}
procedure TFrmBackup.AddIcon(hwnd:HWND);
var
  lpData:PNotifyIconData;
begin
  lpData := new(PNotifyIconDataA);
  lpData.cbSize := 88;
  lpData.Wnd := FrmBackup.Handle;
  lpData.hIcon := FrmBackup.Icon.Handle;
  lpData.uCallbackMessage := WM_BARICON;
  lpData.uID :=0;
  lpData.szTip := '数据库备份工具';
  lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
  Shell_NotifyIcon(NIM_ADD,lpData);
  dispose(lpData);
  FrmBackup.Visible := False;
end;

procedure TFrmBackup.RemoveIcon(hwnd: HWND);//从状态区移去图标
var
  lpData:PNotifyIconData;
begin
  //如果用户点击任务栏图标则将图标删除并回复窗口。
  lpData := new(PNotifyIconDataA);
  lpData.cbSize := 88;//SizeOf(PNotifyIconDataA);
  lpData.Wnd := FrmBackup.Handle;
  lpData.hIcon := FrmBackup.Icon.Handle;
  lpData.uCallbackMessage := WM_BARICON;
  lpData.uID :=0;
  lpData.szTip := 'Samples';
  lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
  Shell_NotifyIcon(NIM_DELETE,lpData);
  dispose(lpData);
end;

procedure TFrmBackup.WMSysCommand(var Message:TMessage);
begin
  if Message.WParam = SC_ICON then
  begin
     //如果用户最小化窗口则将窗口
     //隐藏并在任务栏上添加图标
     AddIcon(handle);
  end
  else if (Message.WParam= SC_Close) and (Min=1)then begin
      Application.Minimize;
      AddIcon(handle);
  end
  else if (Message.WParam=WM_CREATE) and (Min=1)then begin
      Application.Minimize;
      AddIcon(handle);
  end
  else
     //如果是其它的SystemCommand
     //消息则调用系统缺省处理函数处理之。
     DefWindowProc(FrmBackup.Handle,Message.Msg,Message.WParam,Message.LParam);
end;

procedure TFrmBackup.WMBarIcon(var Message:TMessage);
var
   lpData:PNotifyIconData;
   Pt:TPoint;
begin
  if (Message.LParam = WM_LBUTTONDOWN) then
   begin
     RemoveIcon(handle);
     FrmBackup.Visible := True;
   end
   else if (Message.LParam=WM_RBUTTONDOWN) then
   begin
     SetForeGroundWindow(lpData.Wnd);
     GetCursorPos(Pt);
     Popupmenu.Popup(Pt.X,pt.y);
   end;
end;

procedure TFrmBackup.WMMini(var Message:TMessage);
begin
  if (Message.Msg=WM_CREATE) then begin
      Application.Minimize;
      AddIcon(handle);
  end
end;

//定义备份过程
procedure TFrmBackup.BackupBase(FileName:String);
begin
  try
    screen.Cursor:=crSqlWait;
    with connQuery do
    begin
      close;
      Sql.Text:='Backup Database '+Trim(CmbDatabaseName.Text)+' to Disk='''+FileName+''' ';
      ExecSQL;
    end;
    screen.Cursor:=crDefault;
  except
    MessageBox(handle,'备份失败!','提示',MB_IconWarning+mb_Ok);
    screen.Cursor:=crDefault;
    Exit;
  end;
end;

//读取INI文件中的内容
procedure TFrmBackup.ReadIni;
begin
  FilePath:=ExtractFilePath(Application.ExeName)+'System.ini';
  BackupIniFile:=TIniFile.Create(FilePath);
  ServerName:=BackupIniFile.ReadString('Database','ServerName','');
  DatabaseName:=BackupIniFile.ReadString('Database','DatabaseName','');
  UserName:=BackupIniFile.ReadString('Database','UserName','');
  Password:=BackupIniFile.ReadString('Database','Password','');
  Run:=BackupIniFile.ReadInteger('AutoRun','Run',0);
  StartMin:=BackupIniFile.ReadInteger('AutoRun','StartMin',0); 
  Show:=BackupIniFile.ReadInteger('AutoRun','Show',0);
  Min:=BackupIniFile.ReadInteger('AutoRun','Min',0);
  CloseShow:=BackupIniFile.ReadInteger('AutoRun','CloseShow',0);

  BackupType:=BackupIniFile.ReadInteger('Backup','BackupType',0);
  EveryTime:=BackupIniFile.ReadInteger('Backup','EveryTime',0);
  EveryDay:=BackupIniFile.ReadInteger('Backup','EveryDay',0);
  EveryWeek:=BackupIniFile.ReadInteger('Backup','EveryWeek',0);
  EveryMonth:=BackupIniFile.ReadInteger('Backup','EveryMonth',0);

  CmbServerName.Text:=ServerName;
  CmbDatabaseName.Text:=DatabaseName;
  EdtUserName.Text:=UserName;
  EdtPassword.Text:=Password;
  EdtPath.Text:=BackupIniFile.ReadString('FilePath','Path','');
  
  if Run=1 then  //初始化<随开机启动>
    cboAutoRun.Checked:=True
  else
    cboAutoRun.Checked:=False;
  if StartMin=1 then //初始化<启动后最小化>
    cboStart.Checked:=True
  else
    cboStart.Checked:=False;
  if Show=1 then //初始化<备份时显示提示信息>
    cboShowMessage.Checked:=True
  else
    cboShowMessage.Checked:=False;
  if Min=1 then  //初始化<关闭时最小化>
    cboMin.Checked:=True
  else
    cboMin.Checked:=False;
  if CloseShow=1 then  //初始化<不显示关闭信息>
    cboClose.Checked:=True
  else
    cboClose.Checked:=False;
end;

procedure TFrmBackup.btnSetTimeClick(Sender: TObject);
begin
  Application.CreateForm(TFrmSetupTime,FrmSetupTime); 
  FrmSetupTime.ShowModal;
  FrmSetupTime.Free;
end;

#5


procedure TFrmBackup.btnSaveClick(Sender: TObject);
var
  reg:TRegistry;
  S_RegTree:String;
begin
  if not conn then //判断数据库联接是否成功,只有成功之后才能保存
  begin
    MessageBox(handle,'数据库联接没有成功,所以不能保存!','错误',mb_IconWarning+mb_Ok);
    CmbServerName.SetFocus;
    Exit;
  end;
  //将数据库联接参数保存到Ini文件中
  BackupIniFile.WriteString('Database','ServerName',Trim(CmbServername.Text));
  BackupIniFile.WriteString('Database','DatabaseName',Trim(CmbDatabaseName.Text));
  BackupIniFile.WriteString('Database','UserName',Trim(EdtUserName.Text));
  BackupIniFile.WriteString('Database','Password',Trim(EdtPassword.Text));
  BackupIniFile.WriteString('FilePath','Path',Trim(EdtPath.Text));
  //判断是否开机时起动系统
  reg:=tregistry.Create;
  Reg.RootKey:=HKEY_LOCAL_MACHINE;
  S_RegTree:='\Software\Microsoft\Windows\CurrentVersion\Run';
  if Reg.OpenKey(S_RegTree,False)=false then
    Reg.CreateKey(S_RegTree);
  Reg.OpenKey(S_RegTree,True);
  FilePath:=ExtractFilePath(Application.ExeName)+'Backup.exe';

  if cboAutoRun.Checked then
  begin
    Reg.WriteString('BackupDatabase',FilePath);
    BackupIniFile.WriteInteger('AutoRun','Run',1);
  end
  else begin
    Reg.DeleteValue('BackupDatabase');
    BackupIniFile.WriteInteger('AutoRun','Run',0);
  end;
  //启动后最小化
  if cboStart.Checked then
    BackupIniFile.WriteInteger('AutoRun','StartMin',1)
  else
    BackupIniFile.WriteInteger('AutoRun','StartMin',0);
  //<备份时显示提示信息>
  if cboShowMessage.Checked then
    BackupIniFile.WriteInteger('AutoRun','Show',1)
  else
    BackupIniFile.WriteInteger('AutoRun','Show',0);
  //<关闭时最小化>
  if cboMin.Checked then
    BackupIniFile.WriteInteger('AutoRun','Min',1)
  else
    BackupIniFile.WriteInteger('AutoRun','Min',0);
  //<显示关闭信息>
  if cboClose.Checked then
    BackupIniFile.WriteInteger('AutoRun','CloseShow',1)
  else
    BackupIniFile.WriteInteger('AutoRun','CloseShow',0);
  Reg.Free;
  ReadIni();
end;

procedure TFrmBackup.btnBackupClick(Sender: TObject);
var
  FilePath:String;
begin
  try
    if Show=1 then begin
      application.CreateForm(tfrmDlg,frmDlg);
      frmDlg.Show;
    end;

    //文件名等于<年月日时分秒>
    BackFileName:=Trim(CmbDatabaseName.Text)+FormatDateTime('yyyymmddhhmmss',Now); //取得备份文件名
    //取得地址框中的地址
    if RightStr(EdtPath.text,1)='\' then
       FilePath:=EdtPath.Text
    else
       FilePath:=EdtPath.Text+'\';

    FilePath:=FilePath+BackFileName;
    screen.Cursor:=crSqlWait;
    BackupBase(FilePath); //调用备份过程备份文件
    screen.Cursor:=crDefault;
    if Show=1 then
    begin
      frmDlg.Close;
      frmDlg.Free;
    end;
  except
    MessageBox(handle,'备份失败!','提示',MB_IconWarning+mb_Ok);
    screen.Cursor:=crDefault;
    Exit;
  end;
end;


procedure TFrmBackup.btnPathClick(Sender: TObject);
begin
  Application.CreateForm(TFrmDirPath,FrmDirPath); 
  if FrmDirPath.ShowModal=mrOk then
    EdtPath.Text:=FrmDirPath.DirectoryListBox1.Directory;
end;

procedure TFrmBackup.Timer1Timer(Sender: TObject);
var
  Year,Month,Day,Hour,Min,Sec,MSec:Word;
begin
  DecodeDate(Now,Year,Month,Day);
  DecodeTime(Now, Hour, Min, Sec, MSec);

  case BackupType of
  0:begin//不备份
      //
    end;
  1:begin//每小时
      if (Min=EveryTime) and (Sec=0) then
        btnBackupClick(btnBackup);
    end;
  2:begin//每天
      if (Hour=EveryDay) and (Min=EveryTime) and (Sec=0) then
        btnBackupClick(btnBackup);
    end;
  3:begin//每周
      if ((DayOfWeek(Date)-1)=EveryWeek) and (Hour=EveryDay) and (Min=EveryTime) and (Sec=0) then
        btnBackupClick(btnBackup);
    end;
  4:begin//每月
      if (Day=EveryMonth) and (Hour=EveryDay) and (Min=EveryTime) and (Sec=0) then
        btnBackupClick(btnBackup);
    end;
  end;

end;

procedure TFrmBackup.FormCreate(Sender: TObject);
begin
  ReadIni();
  connString:='Driver={SQL server};server='+Trim(CmbServerName.Text)+';database='+Trim(CmbDatabaseName.Text)+
              ';uid='+Trim(EdtUserName.Text)+';pwd='+Trim(EdtPassword.Text);
  try
    connAdo.ConnectionString:=connString;
    connAdo.LoginPrompt:=False;
    connAdo.Connected:=True;
    conn:=True;
  except
    MessageBox(handle,'联接数据库错误','错误',mb_IconWarning+mb_Ok);
    Exit;
  end;

  //取得服务器中所有数据库名
  with connQuery do
  begin
    Close;
    Sql.Text:='select * from master.dbo.sysdatabases';
    open;
    while not Eof do
    begin
      cmbDatabaseName.Items.Add(Fields[0].Value);
      next;
    end;
  end;
  //判断启动时是否最小化窗体
 { if StartMin=1 then
  begin
    //Application.Minimize;
    AddIcon(handle);
  end;  }
end;

procedure TFrmBackup.btnCancelClick(Sender: TObject);
begin
  //取消所做的修改
  ReadIni();
end;

procedure TFrmBackup.N2Click(Sender: TObject);
begin
  close;
end;

procedure TFrmBackup.N1Click(Sender: TObject);
begin
  FrmBackup.Visible := True;
end;

procedure TFrmBackup.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
begin
  if CloseShow=1 then
  begin
    if MessageBox(Handle,'确实要关闭系统吗?','提示',MB_YESNO+MB_ICONINFORMATION)=IDNO then
    begin
      canClose:=False;
    end
    else
    begin
      RemoveIcon(handle);
      Application.Terminate ;
    end;
  end
  else begin
    RemoveIcon(handle);
    Application.Terminate ;
  end;
end;

procedure TFrmBackup.BitBtn1Click(Sender: TObject);
begin
  if Trim(CmbServerName.Text)='' then
  begin
    MessageBox(handle,'数据库服务器名称不能为空!','错误',mb_IconWarning+mb_Ok);
    CmbServerName.SetFocus;
    Exit;
  end;
  if Trim(CmbDatabaseName.Text)='' then
  begin
    MessageBox(handle,'数据库名称不能为空!','错误',mb_IconWarning+mb_Ok);
    CmbDatabaseName.SetFocus;
    Exit;
  end;
  if Trim(EdtUserName.Text)='' then
  begin
    MessageBox(handle,'用户名不能为空!','错误',mb_IconWarning+mb_Ok);
    EdtUserName.SetFocus;
    Exit;
  end;
  connString:='Driver={SQL server};server='+Trim(CmbServerName.Text)+';database='+Trim(CmbDatabaseName.Text)+
              ';uid='+Trim(EdtUserName.Text)+';pwd='+Trim(EdtPassword.Text);
  try
    screen.Cursor:=crSqlwait;
    with connAdo do
    begin
      if Connected then
         Connected:=False;
      ConnectionString:=connString;
      LoginPrompt:=False;
      Connected:=True;
    end;
    MessageBox(handle,'联接成功!','提示',MB_ICONINFORMATION+mb_Ok);
    conn:=True;
    screen.Cursor:=crdefault;
  except
    MessageBox(handle,'联接失败!','提示',mb_IconWarning+mb_Ok);
    screen.Cursor:=crdefault;
    conn:=False;
    Exit;
  end;
end;

end.

#6


so 长!

#7


建议你多看看SQLSERVER的资料,可以通过日志备份

#8


sql server本身即有自动增量备份

#9


有增量备份这个功能,看看帮助吧,或者搜搜sql server版的相关文章

#10


不是说SQLSERVER有日志文件吗?那还需要什么实时备份啊!定时的足够了!
如果是三层结构最多加个错误信息处理机制,或者加个缓冲区