打印本文 打印本文 关闭窗口 关闭窗口
多层数据库开发四:BDE会话期
作者:武汉SEO闵涛  文章来源:敏韬网  点击数1890  更新时间:2009/4/23 18:28:44  文章录入:mintao  责任编辑:mintao
ble1.Open
Except
  ShowMessage(''''Could not open table!'''');
Application.Terminate;
End;
End;
  上面这个例子中调用InputBox函数让用户输入口令,也可以调用PasswordDialog函数,或者用TEdit构件做一个编辑框,把PasswordChar属性设为星号。
  如果用PasswordDialog函数的话,需要传递BDE会话期对象作为参数,程序示例如下:
Procedure TForm1.Button1Click(Sender: TObject);
Begin
If PasswordDialog(Session) then
 Table1.Open
Else
 ShowMessage(''''No password given, could not open table!'''');
End;
  上述程序将打开一个“Enter password”对话框,如图4.1所示。
  图4.1 输入口令
  对话框上的“Add”按钮相当于调用AddPassword函数,“Remove”按钮相当于调用RemovePassword函数,“Remove All”按钮相当于RemoveAllPasswords函数。
  注意:要在程序中调用PasswordDialog函数,必须引用DBPWDlg单元。
如果您没有调用AddPassword或PasswordDialog函数来提供口令,当访问有口令保护的Paradox表和dBase表时,就会自动弹出如图4.1所示的对话框,让用户输入口令。
4.6.2 RemovePassword和RemoveAllPasswords
  TSession的RemovePassword用于删除一个先前用AddPassword输入的口令。RemovePassword只需要传递一个参数,即要删除的口令。程序示例如下:
  Session.RemovePassword(''''1234'''');
  TSession的RemoveAllPasswords函数用于删除先前所有输入的口令,程序示例如下:
  Session.RemoveAllPasswords;
4.6.3 OnPassword和GetPassword
  当程序试图打开一个受口令保护的Paradox表时将触发该事件,应当在处理这个事件的句柄中调用AddPassWord函数输入一个口令,然后把Continue参数设为True。
  调用GetPassword函数也会触发OnPassword事件。下面这个例子动态地把一个方法作为处理OnPassword事件的句柄:
Procedure TForm1. FormCreate(Sender: TObject);
Begin
Session.OnPassword := Password;
End;
  Password又调用InputBox函数打开一个输入框让用户输入口令,如果用户输入了口令的话,就把Continue参数设为True。
Procedure TForm1.Password(Sender: TObject;
var Continue: Boolean);
var Passwrd: String;
Begin
Passwrd := InputBox(''''Enter password'''', ''''Password:'''', '''''''');
Continue := (Passwrd > '''''''');
Session.AddPassword(Passwrd);
End;
  如果用户输入的口令是错误的,则仍然不能打开Paradox表,因此,凡是要打开一个Paradox表的代码必须能处理异常。
  Procedure TForm1.OpenTableBtnClick(Sender: TObject);
const CRLF = #13 + #10;
Begin
Try
Table1.Open; {将触发OnPassword事件}
Except
On E:Exception Do
Begin
ShowMessage(''''Error!''''+CRLF+E.Message+CRLF);
Application.Terminate;
End;
End;
End;
4.7 管理多个BDE会话期对象
  如果要创建一个多线程的数据库应用程序,就需要用多个TSession构件,而且必须在设计期显式地加到窗体或数据模块上,还要保证它们的SessionName属性是相异的。
  Delphi 4用TSessionList来管理和操纵一个应用程序中所有的BDE会话期对象,并且已自动声明了TSessionList的对象示例Sessions。
  如果要动态地创建一个新的BDE会话期对象,这就要用到TSessionList的OpenSession函数。这个函数只需要传递一个参数,即要创建的BDE会话期的名称。程序示例如下:
  Sessions.OpenSession(''''RunTimeSession'''' + IntToStr(Sessions.Count + 1));
  上述代码能保证BDE会话期的名称不会与已有的BDE会话期重复。
  TSessionList定义了一些属性和方法用来操纵BDE会话期对象,这里简单介绍一下:
.Count 返回BDE会话期对象的个数,包括活动的和非活动的;
.FindSession 查找一个指定的BDE会话期对象,如果没有找到,就返回NIL;
.GetSessionNames 返回所有BDE会话期对象的SessionName属性组成的列表;
.List 通过这个属性可以按名称访问一个BDE会话期对象;
.OpenSession 动态地创建一个BDE会话期对象;
.Sessions 通过这个属性可以按序号访问一个BDE会话期对象。
  在多线程的数据库应用程序中,在打开一个数据库之前,首先要检查这个数据库是否已经被其他线程打开。怎么检查呢?用TSessionList的Count属性和Sessions属性遍历所有的BDE会话期对象,逐个检查每个BDE会话期对象的Databases属性中是否包含要打开的数据库,如果有的话,说明这个数据库已经被某个线程打开,也就是说,不能再在这个BDE会话期内打开数据库,您得换下一个再进行检查。
  如果所有的BDE会话期对象都在使用这个数据库,就必须创建一个新的BDE会话期对象,然后再打开数据库。

上一页  [1] [2] 

打印本文 打印本文 关闭窗口 关闭窗口