[返回]
中国计算机报2001年第31-32期

PB中实现可监控的数据备份

顾 勇

在众多的数据库应用开发平台中,PowerBuilder作为一个强大的图形Client/Server数据库应用程序开发工具而得到广泛使用。本文将向读者详细介绍在PB开发的数据库应用程序中实现可监控数据备份的具体解决方案。

  PowerBuilder是当今数据库应用程序中常用的开发工具之一,开发者能用它来建立用户容易使用的各种数据库应用程序,PB内部定义的函数种类繁多,并允许开发者修改其数据库,当然,PB的部分功能也存在着不足。

  在数据库系统中,数据备份是一种最为常用也极其重要的功能。在数据库DBMS环境下,我们可以直接调用数据库本身提供的图形化或命令行式的备份命令进行备份,而在PB中却只能使用Run ( string { windowstate } )的格式调用DOS下的命令,而这种方法的一个重要弊端就是数据库备份的成功与否,只能在DOS窗口中以数据库系统的自身返回信息显示,一般情况下为英文字符,这样既与应用程序的中文界面不协调,也增加了对使用人员的要求,显得不够专业。

  在实践中,笔者发现一种根据数据库的返回信息自动判断备份成功与否的方法,并能在数据备份没有完成时拒绝退出,效果令人满意。下面在PowerBuilder 6.5、Oracle 7.3.2、Windows 9x环境下就这一方法的实现做一介绍。

  1.在“备份”图标按钮的Click事件中加入以下代码:

  if fileexists("c:\jybak.log") then

   filedelete("c:\jybak.log")

  end if

  Run("exp73 userid=scnmis/scnmis@jydb file=c:\jybak.dmp full=y log=c:\jybak.log",Minimized!);

  st_message.text='正在备份,请耐心等待。'

  back_up = True

  其中,back_up为全局变量,定义为:boolean back_up = false。

  2.在窗口的Timer事件中加入以下代码:

  long file_handle

  string read_line

  If back_up Then

  st_message.text='正在备份,请耐心等待。'

   If L_quit Then

   SetPointer(Hourglass!)

   End If

   file_handle = fileopen( 'c:\jybak.log',LineMode!)

  do while fileread(file_handle,read_line) > -1

   loop

   If file_handle > 0 Then

   fileclose(file_handle)

   SetPointer( Arrow! )

   if Left(read_line,30) <> "Export terminated successfully" then

   st_message.text='数据备份失败!'

   Messagebox("警告:", "数据备份失败!")

   else

   st_message.text='数据备份成功!'

   Messagebox("恭喜!", "数据备份成功!")

   end if

   g_bfbz = True

   back_up = False

   If L_quit Then

   close(w_main)

   Exit_Windows( 5,0 )

   End If

   End If

  End If

  其中,Exit_Windows为Global External Function,定义为:FUNCTION long ExitWindowsEx(long a,long b) LIBRARY "user32.dll"。

  3.至此,监控的数据备份的目的基本已经达到。为了实现在备份没有完成的情况下禁止退出,在“退出”图标按钮的Click事件中加入以下代码:

  long file_handle ,i

  string read_line

  long rc,allow

  rc = MessageBox( "请您选择:", "是否退出系统?", Question!, YesNo! )

  if rc = 1 then

   If g_bfbz = False then

   If back_up Then

   MessageBox( "提示信息:","备份正在进行,完成后才能退出。按确定继续备份")

   Goto Lab0

   Else

   allow = Messagebox("提示信息","退出前应当备份,现在开始吗?", Question!, YesNo!)

   L_quit =true

   If allow=1 Then

   Triggerevent(Cb_backup,Clicked!)

   Else

   close(w_main)

   ExitWindowsEx( 5,0 )

   End If

   End If

   Else

   close(w_main)

   ExitWindowsEx( 5,0 )

   End if

  End if

  以上方法在PowerBuilder 6.5、Oracle 7.3.2环境下调试通过,但在其他开发工具或数据库系统中也可使用这种方法,代码的改动量不大,具有一定的实用价值。