分布式多层数据库系统的应用(一)

时间:2023-03-07 11:02:42 计算机毕业论文 我要投稿
  • 相关推荐

分布式多层数据库系统的应用(一)

摘要
 
本次毕业设计任务是通过开发一个分布式多层数据库图书管理系统,学习用delphi开发分布式多层数据库系统。采用Delphi6.0和MS Server2000等软件为开发工具;通过对计算机硬件和软件解决方案的论证;对应用领域进行调查分析;参考各种资料和进行数据库编程实践。在指导老师的帮助下,已经基本上成功地实现了设计任务书的要求。使得设计的数据库系统能够实现一般数据库的管理。我们研究了数据库的查询优化问题。

 第一部分  引 言
 
1.1任务或问题:
 开发一个分布式多层图书管理系统,可以实现动态的连接应用程序服务器,只要对配置文件进行配置,就可以像网上邻居一样选择所要连接的应用程序服务器。并提供借书还书,图书和期刊检索等查询功能。
1.2实际背景:
 随着社会发展,人类的生产、生活越来越离不开信息。谁拥有了更多更有效的信息,谁就将在竞争中处于有利地位。信息产业正在成为一个国家的支柱。数据作为信息的载体,其管理工具数据库对于信息技术的重要性,正日益得到人们的重视。只有拥有了先进的数据库技术,才能有效地管理好浩如烟海的数据,并从中提取出对自己有用的信息来加以利用。
 90年代,人们开发MIS系统大都采用客户机/服务器结构,客户机/服务器结构既是硬件结构又是软件结构。即数据放在服务器上,程序在客户机上。进行数据访问时,由客户机提出请求(一般是SQL语句),服务器执行并给出结果。客户机/服务器对于优化了网络,提高了系统的利用率。客户机/服务器体系结构的发展经历了从二级体系结构模式到三级体系结构模式。
1.3我的工作
    设计系统框架,设计数据库,编写代码,测试数据等。
1.4特色(创新)
 可以像网上邻居一样选择所要连接的应用程序服务器。
 
 第二部分 毕业设计课题
 
设计课题
 漳大图书馆管理系统
设计时间
 二○○四年10月至二○○四年12月
设计人员及任务
 王东凯  动态连接服务器模块的实现及帮助件功能模块的实现
 王开斌  分布式多层数据模块的实现
 王杰林  图书管理功能模块的实现
 陈庆辉  sqlserver 2000数据库的分析及表的设计
指导老师
 苏绿园
设计内容
 利用Delphi6.0和MS Server2000为主要开发工具,以WindowsXP为开发平台。设计出分布式多层应用的图书馆管理系统。可以实现动态的连接应用程序服务器,只要对配置文件进行配置,就可以像网上邻居一样选择所要连接的应用程序服务器。实现与应用程序服务器快速而准确的连接。
 
 第三部分 系统方案论证
 
3.1软件定义 
    数据库设计所要的解决的问题是:对于一个给定的应用领域,设计优化的数据库逻辑和物理结构,使之满足用户的信息管理要求和数据操作要求,有效地支持各种应用系统的开发和运行。数据库设计的目标是为用户和各种应用系统提供一个高效的运行环境。而数据库的设计可以视为如下的优化问题。
计算机的软硬件环境;
数据库管理系统的能力;
用户的操作要求与信息要求;
完整性和安全性约束。
3.2 体系结构规划
 本次设计的系统采用 三层″客户/服务器″体系,为了便于理解,我们先从二层″客户/服务器″体系结构来阐述:
 客户/服务器是在网络基础上,以数据库管理为后援,以计算机为网上工作站的一种系统结构。该结构的关键在把网络环境上的数据库存取和应用程序一分为二,分别由网上的数据库服务器和网上客户来执行。虽然本系统客户/服务器是建立在LAN的基础上,但它比以往的文件服务系统有了很大的改进。首先,它消除了不必要的网络传输负担;其次,它可以使作为数据库服务器的计算机被高度优化,以适应数据处理的需要。客户/服务器已经能够应用于复杂的网络上,并使之能够更有效地进行选择、检索、索引排序等数据处理。作为一种高级的分布式计算机环境、客户/服务器有足够的能力把处理后的结果(不是整个文件)通过网络传输出去,并根据用户需求灵活地配置各种大、中、小型计算机系统。
3.3 系统设计
数据流图
             
             管理要求                           查询要求

              管理结果                          查询结果


                                    (顶层数据流图)
数据库设计过程
 数据库的设计过程如下图所示。在数据库设计过程中,需求分析和概念设计可以独立于任何数据库管理系统进行。逻辑设计和物理设计与具体的数据库管理系统密切相关。由于需求分析比较重要。我们在设计的时候,花了比较多的时间。在获得这些资料之后,进行分析。从中提取有用的部分。分析各种用户的权限。
                          需求分析说明书
     图:数据库设计过程
 
 第四部分 毕业设计内容
 
4.1分布式多层数据库开发简介
 Delphi提出的MIDAS(Multi-Tier distributed Application Services Suite多层分布式应用服务器组),是把原来Two- Tier数据连接放到了服务器端的COM组件上,客户端只剩下了执行文件和MIDAS.DLL,前台和服务器上的COM组件,通过DCOM机制互相沟通。
 这个多的一层,称为应用程序服务器(Application Server),或者称为中间件。整个工作机制见下图:
 
 这种多层分布式工作机制,主要基于这样几点考虑:
减少客户机的维护量,因为前台程序比较简单;
 把企业逻辑封装在通用的中间件应用服务器中,不同的客户都可以共享同一个中间层(包括Web),而不必每个客户都单独实现企业规则,避免了重复开发和维护的麻烦。由于客户程序相当瘦(这就是现在流行的瘦客户机概念),无论是开发还是发布,都变得简单了。
便于升级,当中间件升级的时候,客户程序可能不需要变化;
实现了分布式数据处理,把一个应用程序分布在几台机器上运行,可以提高应用程序的性能,也可以把敏感部分封装在中间件,为不同的用户设置不同的访问权限,增强了安全性。
减少直接连接数据库的用户数目,减少费用。
 在Delphi 6.0上,在原来的MIDAS基础上,发展了DataSnap技术,在很多细节方面,它提供了原来MIDAS所没有的许多功能,使用上更加方便了。
 DataSnap主要提供客户端和中间件之间的通信,不但支持COM+技术也支持TCP/IP或者CORBA,它们使用类似的界面和方法,其结果由程序自动完成,这就大大扩充了它的应用范围。
 必须要提醒的是,前台机器上除了应用程序以外,还必须把一个MIDAS.DLL文件复值到前台机器上,这个文件在服务器的WINNT\System32目录下。
 
4.2 服务器端程序的建立

    服务器端程序实际上是个COM 工程,它本身连接数据源,再通过接口与客户端联系,这个COM 工程必须注册在服务器上。
 首先建立一个空白的工程,在工程里放置一个Adoconnection组件。然后再建一个远程数据模块file -> New -> Other -> Multitier -> Remote Data Module(远程数据模块)。   Coclass Name : libserver ,Instancing  :执行模式,大部分用Multiple Instance(多重实例),Threading Model:线程模式,建议用Apartment(单元),产生一个窗口,在这个窗口里,可以放入数据控件。
    在Viwe -> Type Libray 中,我们可以看到这个COM 的一些特性。我们也可以记下系统提供的GUID,以备后来使用。加入一个ADOTable,并设置其指向一个数据库。再设置一个DataSetProvider(在DataAccess页)指向ADOTable,这就完成了服务器端的程序设计。
保存,编译,注册(注意,只要运行就自动在本机注册了)。

4.3 客户端程序的建立

    在Two-Tier模式中,客户端(Client)程序是直接和服务器的数据源相连的,而Multi-Tier模式,多个客户端连接的是一个应用程序服务器,因为收费是按客户端数计算的,所以,数据库的使用费用比较低。
    1)建立一个普通的工程。   
 2)放置一个TDCOMConnrction控件(在Datasnap页),属性:在本机注册时,可直接设置以下属性:ServerName:应用程序服务器注册名(server.libserver)   ,Connected=true。这时你可以看到服务器端的COM 程序被激活了。如果在网络上调试,需要给出服务器名:ComputerName:服务器名(自动给出网上邻居)注意: ServerGUID的GUID值是自动给出的。
 3)放置一个TClientDataSet控件(在Data Access页),属性RemoteServer= DCOMConnrction1,ProviderName:=DataSetProvider1(服务器端将被激活),Active=true (激活后将能正常连接)
    4)放置TDataSource,属性:Dataset:指向cdsCustomer。
 这样一个客户端程序就建立好了,其余犹如普通的数据库设计。
 
4.4  客户端实现SQL 查询

    由于在客户端不存在TQuery控件,似乎客户服务器模式是无法做SQL查询的。但是,Delphi很好的解决了这个问题。事实上,只要客户端连接上服务端应用程序,客户端的TClientDataSet就包含了一个名字为Provider的属性,对应到服务器端DataSetProvider的所有默认属性和方法,其中DataSetProvider有一个Options属性,只要让其中的poAllowCommandText=true, 那么,DataSetProvider的poAllowCommandText就可以接受前台来的SQL 命令,并传送给TQuery。
    可以看出,真正传递数据的是DataSetProvider的接口,所以,用这个接口搭建传递SQL 的桥梁是必需的。客户端进行SQL 查询的方法是:
      ClientDataSet.Close;
      ClientDataSet.CommandText := 'SQL语句';
 ClientDataSet.Open;
 
4.5 动态连接应用程序服务器的实现
 
  客户端程序在运行时,需要连接应用服务器程序以取得服务。但是,在系统实际应用的时候,运行应用服务器程序的计算机是经常改变的,因此在客户端程序启动时,应该先找到运行应用服务器程序的计算机的设置。动态连接应用服务器的流程类似于12.3节的动态数据库连接,动态连接应用服务器程序的流程图14-1所示。
 掌握了动态连接应用服务器的流程,就可以具体实现它。下面就将分步骤介绍动态连接应用服务器的实现过程。
在Delphi中新建一个窗体,将单元文件保存为connect.pas窗体的Name属性设为fm_serconfig,Caption属性设为”服务器配置”,运行后窗体如下图所示。
 
 (2) 在“连接设置”窗体中,需要输入应用服务器主机名(或者应用服务器IP地址)和应用服务器的端口号,这些配置信息将用来连接应用服务器。如果连接成功,输入的配置信息将被写入到注册表中,以后程序启动时,读取注册表配置信息,就可而已连接应用服务器程序了。程序的具体实现部分如程序清单如下所示。
procedure BitBtn1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
procedure WriteToReg(const bappHost,bappIp,aPort:string);
{ Private declarations }
public
{ Public declarations }
end;
var
   fm_SerConfig: Tfm_SerConfig;  Connected: boolean= false;   //代表是否连接成功
 implementation
 uses netlist, data;
 {$R *.dfm}
 procedure Tfm_SerConfig.BitBtn1Click(Sender: TObject);
 begin
    if ((Edt_host.Text='') or (Edt_host.Text=null))
       and((Edt_ip.Text='') or (Edt_host.Text=null)) then
    begin
    application.MessageBox('请输入服务器和IP','输入错误',
                      mb_iconinformation + mb_defbutton1);
    exit;
    end;
    try
      strtoint(edt_Port.text);
    except
       Application.MessageBox('请输入正确的端口号', '输入错误..', mb_iconinformation + mb_defbutton1);
      exit;
    end;
    statusbar1.Panels[0].Text:='正在连接服务器,pleale wait';
    statusbar1.Refresh;
    screen.Cursor:=crHourGlass;
    fm_data.Socket.Connected:=false;
    fm_data.Socket.Host:=edt_host.Text;
    fm_data.Socket.Address:=edt_ip.Text;
    fm_data.Socket.Port:=strtoint(edt_port.Text);
    try
      screen.Cursor:=crdefault;
      fm_data.Socket.Connected:=true;
      application.MessageBox('连接成功','图书管理系统', mb_iconinformation + mb_defbutton1);
      connected:=true;
    except
      screen.Cursor:=crdefault;
      application.MessageBox('连接失败','图书管理系统',mb_iconinformation+mb_defbutton1);
      connected:=false;
    end;
 //连接成功向注册表里写入应用服务器配置信息
   WriteToReg(edt_Host.Text, edt_IP.Text, edt_Port.Text);
   close;
 end;
 //利用可视化窗体来选择计算机
 procedure Tfm_SerConfig.Button1Click(Sender: TObject);
 begin
 edt_ip.Clear;
 edt_host.Text:=   NetExecute(TFm_NetList);
 end;
 //把信息写入注册表
 procedure Tfm_SerConfig.WriteToReg(const bappHost,bappIp,aPort:string);
 var
 reg:Tregistry;
 begin
   reg:=Tregistry.Create;
   reg.RootKey:=HKEY_LOCAL_MACHINE;
   if not reg.OpenKey('\Software\pz',false) then //如果可以创建目录
   begin
   reg.CreateKey('\Software\pz');
   reg.OpenKey('\Software\pz',false);
   end;
   reg.WriteString('host',bapphost);
   reg.WriteString('ip',bappip);
   reg.WriteString('port',aport);
   reg.Free;
 end;
 end.
 打开“连接设置”配置窗口,在打开窗体之前,函数已经将布尔变量Connected设为False,而在窗体被关闭之后,将返回Connected变量的值,根据布尔变量Connected的值可以判断是否已经连接上应用服务器。
 (3) 在连接设置主窗口中,我们为应用服务器名提供了辅助录入的方法,点击应用服务器名编辑框右边的省略号按钮(Button1),将弹出一个浏览局域网计算机的对话框,以方便用户选择应用服务器所在的计算机。在此我们调用了一个NetExecute方法,它将返回用户选中的计算机的主机名。这个方法是如何实现的呢?下面将介绍NetExecute方法的实现过程。
 在Delphi中新建一个窗体,将窗体单元文件保存为netlist .pas,窗体的Name属性设为Fm_netlist。运行后窗体如下图所示。
 
 在列举网络资源窗体中,将按照工作组以树型目录的形式显示局域网中的计算机。程序的具体实现部分如下所示。
procedure FormActivate(Sender: TObject);
procedure TreeView1Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
private
  procedure getcomputername;
  procedure getgroupname;
  { Private declarations }
public
  { Public declarations }
end;
function NetExecute(aFormClass: TFormClass): string;
var
  fm_NetList: Tfm_NetList;
  node: Ttreenode;
  aComputerName : string;//全局变量,存储选中的主机名
implementation
{$R *.dfm}
//打开窗体,并返回选定的计算机
function NetExecute(aFormClass: TFormClass): string;
begin
  aComputerName := '';
  with aFormClass.Create(Application) do
  begin
    try
      showModal;
    finally
      free;
    end;
    result := aComputerName;
  end;
end;

procedure TFm_netlist.FormActivate(Sender: TObject);
begin
node:=treeview1.items.add(Treeview1.topitem, '整个网络');
node.imageindex:=0;
treeview1.setfocus;
end;

procedure TFm_netlist.TreeView1Click(Sender: TObject);
begin
  if treeview1.Selected.Level=0 then
  begin
    if treeview1.Selected.Count=0 then
    //添加工作组名
    getgroupname();
  end;
  if treeview1.Selected.Level=1 then
  begin
    if treeview1.Selected.Count=0 then
    //添加计算机名
    getcomputername;
  end;
  if treeview1.Selected.Level=2 then
  bitbtn1.Enabled:=true
  else
  bitbtn1.Enabled:=false;
end;
//取得计算机名
procedure Tfm_netlist.getcomputername;
var
  NetResource: TNetResource;
  Buf: Pointer;
  Count, BufSize, Res: DWord;
  Ind: Integer;
  lphEnum: THandle;
  Temp: TNetResourceArray;
  groupname: string;
  my_node: Ttreenode;
  my_node_2: Ttreenode;
begin
  screen.Cursor := crHourGlass;
  statusbar.panels[0].text := '正在列举组名...,请稍侯';
  statusbar.refresh;
  my_node := treeview1.Selected;
  groupname := treeview1.Selected.Text;
  FillChar(NetResource, SizeOf(NetResource), 0); //初始化网络层次信息
  NetResource.lpRemoteName := @GroupName[1]; //指定工作组名称
  NetResource.dwDisplayType := RESOURCEDISPLAYTYPE_SERVER; //类型为服务器(工作组)
  NetResource.dwUsage := RESOURCEUSAGE_CONTAINER;
  NetResource.dwScope := RESOURCETYPE_DISK; //列举文件资源信息
  //获取指定工作组的网络资源句柄
  Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
    RESOURCEUSAGE_CONTAINER, @NetResource, lphEnum);
  if Res <> NO_ERROR then Exit; //执行失败
  while True do //列举指定工作组的网络资源
  begin
    Count := $FFFFFFFF; //不限资源数目
    BufSize := 8192; //缓冲区大小设置为8K
    GetMem(Buf, BufSize); //申请内存,用于获取工作组信息
   //获取计算机名称
    Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
    if Res = ERROR_NO_MORE_ITEMS then break; //资源列举完毕
    if (Res <> NO_ERROR) then Exit; //执行失败
    Temp := TNetResourceArray(Buf);
    for Ind := 0 to Count - 1 do //列举工作组的计算机名称
    begin
      //获取工作组的计算机名称,+2表示删除"\\",如
      my_node_2 := treeview1.Items.AddChild(my_node, Temp^.lpRemoteName + 2);
      my_node_2.imageindex := 2;
      Inc(Temp);
    end;
  end;
  Res := WNetCloseEnum(lphEnum); //关闭一次列举
  if Res <> NO_ERROR then exit; //执行失败
  FreeMem(Buf);
  screen.Cursor := crDefault;
  statusbar.panels[0].text := '';
  statusbar.refresh;
end;

//获取组名
procedure Tfm_NetList.GetGroupName;
var
  NetResource: TNetResource;
  Buf: Pointer;
  Count, BufSize, Res: DWORD;
  lphEnum: THandle;
  p: TNetResourceArray;
  i, j: SmallInt;
  NetworkTypeList: TList;
  my_node_1: Ttreenode;
begin
  statusbar.panels[0].text := '正在列举域名...,请稍侯';
  statusbar.refresh;
  screen.Cursor := crHourGlass;
  NetworkTypeList := TList.Create;
  //获取整个网络中的文件资源的句柄,lphEnum为返回名柄
  Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
    RESOURCEUSAGE_CONTAINER, nil, lphEnum);
  if Res <> NO_ERROR then exit; //执行失败
  //获取整个网络中的网络类型信息
  Count := $FFFFFFFF; //不限资源数目
  BufSize := 8192; //缓冲区大小设置为8K
  GetMem(Buf, BufSize); //申请内存,用于获取工作组信息
  Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
  if (Res = ERROR_NO_MORE_ITEMS) //资源列举完毕
    or (Res <> NO_ERROR) //执行失败
    then Exit;
  P := TNetResourceArray(Buf);
  for I := 0 to Count - 1 do //记录各个网络类型的信息
  begin
    NetworkTypeList.Add(p);
    Inc(P);
  end;
  //WNetCloseEnum关闭一个列举句柄
  Res := WNetCloseEnum(lphEnum); //关闭一次列举
  if Res <> NO_ERROR then exit;
  for J := 0 to NetworkTypeList.Count - 1 do //列出各个网络类型中的所有工作组名称
  begin //列出一个网络类型中的所有工作组名称
    NetResource := TNetResource(NetworkTypeList.Items[J]^); //网络类型信息
  //获取某个网络类型的文件资源的句柄,NetResource为网络类型信息,lphEnum为返回名柄
    Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
      RESOURCEUSAGE_CONTAINER, @NetResource, lphEnum);
    if Res <> NO_ERROR then break; //执行失败

    while true do //列举一个网络类型的所有工作组的信息
    begin
      Count := $FFFFFFFF; //不限资源数目
      BufSize :=8192; //缓冲区大小设置为8K
      GetMem(Buf, BufSize); //申请内存,用于获取工作组信息
              //获取一个网络类型的文件资源信息,
      Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
      if (Res = ERROR_NO_MORE_ITEMS) //资源列举完毕
        or (Res <> NO_ERROR) //执行失败
        then break;
      P := TNetResourceArray(Buf);
      for I := 0 to Count - 1 do //列举各个工作组的信息
      begin
        my_node_1 := treeview1.Items.addchild(node, StrPAS(P^.lpRemoteName)); //取得一个工作组的名称
        my_node_1.imageindex := 1;
        Inc(P);
      end;
    end;
    Res := WNetCloseEnum(lphEnum); //关闭一次列举
    if Res <> NO_ERROR then break; //执行失败
  end;
  FreeMem(Buf);
  NetworkTypeList.Destroy;
  screen.Cursor := crDefault;
  statusbar.panels[0].text := '';
  statusbar.refresh;
end;
procedure TFm_netlist.BitBtn1Click(Sender: TObject);
begin
  aComputerName := treeview1.Selected.Text;
  close;
end;
end.
 在上面的程序清单中,首先定义了NetExecute方法,它根据传递进来的TFormClass参数值TformNet,打开“列举网络资源”窗口,用户可以在此窗口中选择想要连接的运行应用服务器程序的计算机。NetExecute方法将返回选中的计算机主机名。
 在程序清单中,还自定义了GetGroupName和GetComputerName这两个非常重要的过程,其中GetGroupName方法用于获取网络中所有的工作组名称,并将工作组名添加到目录树的第二级目录中;GetComputerName方法则根据工作组的名称穷举工作组下的计算机,并将这些计算机添加到目录树的第三级目录中。
 选择好计算机后,单击“确定”按钮,系统将把选定的计算机主机名赋给aComputerName全局变量,此时在NetExecute方法中,便返回此值。
 (4) 在data单元(data.pas)中定义connect_app方法。connect_app方法用语读取注册表中配置应用服务器的信息并测试连接,如果没有连接上应用程序服务器将从新弹出配置窗口。这个接口方法在程序主窗体创建时被调用,用以尝试连接应用服务器。
 ConnectAppServ方法在interface中的具体定义为:
function TFm_data.connect_app: boolean; //判断是否连接上了应用服务器
var
  vs_Host, vs_Address, vs_Port: string;
  reg: TRegistry;
begin
  Result := True;
  reg := Tregistry.create;
  Reg.RootKey := HKEY_LOCAL_MACHINE;
  socket.Connected := false;
  //读取注册表配置的应用服务器信息
  if Reg.OpenKey('\Software\pz', False) then  //如果注册表有信息
  begin
    vs_Host := reg.ReadString('Host');
    vs_Address := reg.ReadString('ip');
    vs_Port := reg.readstring('Port');
    try
      //测试连接
        socket.Address := vs_Address;
        socket.Host := vs_Host;
        socket.Port := strtoint(vs_Port);
        socket.Connected := true;
      reg.closekey;
    except //未连接上,弹出配置窗口
      reg.closekey;
        try
            fm_SerConfig := Tfm_serconfig.create(self);
            fm_SerConfig.showmodal;
        finally
            fm_SerConfig.free;
        end;
    end;
  end
  else      //如果没有信息 弹出配置窗口
  begin
     try
            fm_SerConfig := Tfm_SerConfig.create(self);
            fm_SerConfig.showmodal;
        finally
            fm_SerConfig.free;
        end;
  end;
end;
 在此过程里,将主要读取键为“HKEY_LOCAL_MACHINE\SOFTWARE\PZ”目录下的应用服务器主机名,应用服务器IP地址和端口号的值,然后将这些值赋给主窗体的SocketConnection组件以测试连接。如果连接成功就返回True值,如果连接失败,将弹出“连接设置“窗口,用户需要从新输入应用服务器主机名,应用服务器IP地址和端口号。如果仍然连接失败,就返回False值,表示连接失败。
 (5) 动态连接设置的最后一个步骤就是在主窗体被创建时,调用第4步中自定义的Imyserver_autho方法,判断应用程序是否连接上了应用服务器。如果连接成功,将进入应用程序;如果连接失败,将退出应用程序。
 至此,动态连接应用服务器就做完了。

4.6  图书管理功能的实现

 图书管理系统需要满足来自三方面的需求,这三个方面分别是图书借阅者、图书馆工作人员和图书馆管理人员。图书借阅者的需求是查询图书馆所存的图书、个人借阅情况及个人信息的修改;图书馆工作人员对图书借阅者的借阅及还书要求进行操作,同时形成借书或还书报表给借阅者查看确认;图书馆管理人员的功能最为复杂,包括对工作人员、图书借阅者、图书进行管理和维护,及系统状态的查看、维护并生成催还图书报表。    图书借阅者可直接查看图书馆图书情况,如果图书借阅者根据本人借书证号和密码登录系统,还可以进行本人借书情况的查询和维护部分个人信息。一般情况下,图书借阅者只应该查询和维护本人的借书情况和个人信息,若查询和维护其他借阅者的借书情况和个人信息,就要知道其他图书借阅者的借书证号和密码。这些是很难得到的,特别是密码,所以不但满足了图书借阅者的要求,还保护了图书借阅者的个人隐私。    图书馆工作人员有修改图书借阅者借书和还书记录的权限,所以需对工作人员登陆本模块进行更多的考虑。在此模块中,图书馆工作人员可以为图书借阅者加入借书记录或是还书记录,并打印生成相应的报表给用户查看和确认。    在本系统中由于没有打印机设备供试验,所以没有制作打印模块。本系统提供的功能有    1. 设计不同用户的操作权限和登陆方法    2. 对所有用户开放的图书查询    3. 借阅者维护借阅者个人部分信息    4. 借阅者查看个人借阅情况信息    5. 维护借阅者个人密码     6. 查询及统计各种信息    7 . 维护图书信息     8. 维护借阅者信息     9. 对借阅过期的图书进行通知
 
 第五部分 毕业设计心得体会及结论
 
 在苏绿园老师的指导下。本次毕业设计,就要画上一个句号了。可是,对我来说,这次设计的本身所产生的影响,还远远没有结束,我从本次毕业设计中学到了许多课本上没有的知识。从设计任务书的下达到今天基本实现任务书中的设计要求,时间已整整过去了两个月。在这两个月中。通过自己的学习和努力;通过各位老师的指导和教育,使我不仅仅在知识水平和解决实际问题的能力上有了很大的提高。还从思想的深处体会到,要把自己的所学变成现实时所将面对的种种难题。
 由于我平时的课程理论知识学的还可以,我总是认为自己的知识水平已经能处理许多的现实问题了。而当自己真正的深入到设计实践当中,深入到问题当中时。我竟然发现自己无从下手,我开始怀疑我是否真正的学到了知识。也只有到了那个时候,我才真正体会到学会运用自己的能力与知识是何等的重要,知识是在课堂上,老师教授的,在书本中学到的,实践则是要自己动手,自己去做才能掌握。
 在老师们的关心和帮助下,我渐渐的开始了设计。根据老师的建议,我找来了数据库设计与建设的相关书籍和资料,从最基本的问题入手开始一个个的解决我心中的疑惑。 这是一个漫长的学习过程。随着时间的推移,我开始慢慢的掌握了设计时所需要的知识。我也终于明白了大学三年学习的意义和作用。扎实的基本功和良好的学习习惯,能使自己在学习新知识有更深刻的认识力和更快的领会力。
 同时老师对毕业设计的重视也是我能完成设计的一个重要条件。为了保证我们毕业设计的正常进行,学院抽调了优秀的老师指导我们进行毕业设计,提供良好的设备给我们,在软硬件上支持我们进行毕业设计,并且不时地询问我们毕业设计的进展情况。为我们这次设计的正常开展提供了必要的物质基础。
关于本次设计的命题,我的设计只能提供其基本的功能。还有许多的设想由于时间和自身和因素无法得以实现,这不能不说是本次设计的遗憾之处。不过,至少它已经启发了自己的思维,提高了我的动手能力,这是我在课本中学不到的。它为我们在以后的工作岗位上发挥自己的才能奠定了坚实的基础。
              第六部分 附录
6.1参考资料
《软件工程》     陆惠恩 陆培恩 主编        电子工业出版社  2004年
《delphi高级程序员认证教材》  北京科海培训中心       Delphi主讲教师:谢新华
《SQL Server2000数据库及应用基础》徐人凤 曾建华 主编  高等教育现版社 2004年
《Delphi 6深度编程及其应用开发》  李存斌 汪兵 编著  中国水利水电出版社   2002年

【分布式多层数据库系统的应用(一)】相关文章:

多层螺旋CT心功能评价研究概况06-14

一种在分布式个域网中主控设备的重定位机制05-11

PKPM进行多层框架结构设计的主要步骤10-31

液氢的生产及应用09-12

机电技术一体化的应用论文(精选13篇)07-28

浅谈MOF材料的应用04-21

审计风险模型的演进及应用08-26

纳米材料在电池中的应用08-05

电子商务应用论文11-02

计算机应用论文02-15