利用Delphi实现两层C/S数据库应用程序设计

来源:互联网 发布:网络歌手瑞可图片 编辑:程序博客网 时间:2024/05/06 14:32


 Delphi   C/S数据库结构模式   数据库管理   MS-SQL server
Delphi具有非常强大的数据库管理功能,能适应多种数据库结构,从桌面数据库到客户机/服务器模式再到多层数据库结构模式,都能胜任。本文以数据库服务端软件Microsoft SQL Server 2000及客户端开发软件Delphi 6.0为例,简要介绍开发两层C/S结构数据库应用程序的一般步骤、方法和部分实例。

一、应用程序开发环境
客户/服务器(C/S)结构包括连接在一个网络中的多台计算机。请求另一台计算机为之服务的计算机称为客户机(Client)。而处理数据库的计算机称为服务器(Server)。下面是本文使用的开发环境。
1、服务端网络数据库系统
目前,在开发C/S数据库应用程序时,可以在服务器端使用的数据库管理系统有:ORACLE公司的ORACLE数据库,Sybase公司的Sybase数据库,DB2服务端网络数据库,微软公司的Microsoft SQL Server等等。本文使用的是Microsoft SQL Server 2000,安装后可以很方便地使用SQL Server 服务器管理工具启动后台数据库服务程序,为客户端提供数据库服务。
2、客户端数据源的配置
C/S数据库应用程序的客户端必须能与服务端的数据库管理系统进行网络通信。本文的客户端使用的是ODBC for SQL Server驱动程序及TCP/IP协议与服务端进行连接。在ODBC管理器中的系统DSN中增加两个驱动为SQL Server的数据源连接,名称为MSSQL1和MSSQL2,分别连接Microsoft SQL Server 2000中的例行数据库pubs和Northwind。ODBC配置完成后,打开BDE Administrator便可看到,在BDE Administrator已经自动创建了别名为MSSQL1和MSSQL2的数据库。

二、创建客户端数据库应用程序
SQL语言作为关系数据库管理系统中的一种通用的结构化查询语言,已被众多的数据库管理系统采用,Delphi通过TQuery, TStoredProc, UpdateSQL, TDatabase, TSession等组件支持SQL Server数据库编程。下面介绍通过Delphi的相关组件开发客户端应用程序的一般步骤和方法。
1、建立与数据库的连接
Delphi使用Tdatabase控件控制程序与数据库的连接,并使用Tsession控件对所有Tdatabase 控件进行全局控制,当创建数据库应用程序时,应用程序会自动创建一个默认的BDE会话期对象Session,新加入的TDatabase对象会默认地处于Session管理之下 。
在窗体上放四个命令按钮:FirstOpen, FirstClose, SecondOpen 和SecondClose,放两个TDatabase组件Database1和Database2,其相关代码如下:
procedure TForm1.FirstOpenClick(Sender: TObject);
begin
  database1:=session.OpenDatabase(’MSSQL1’);
end;

procedure TForm1.SecondOpenClick(Sender: TObject);
begin
  database2:=session.OpenDatabase(’MSSQL2’);
end;

procedure TForm1.FirstCloseClick(Sender: TObject);
var db:TDatabase;
begin
  db:=session.FindDatabase(’MSSQL1’);  //查找是否有以MSSQL1为别名的database对象
  IF (DB<>NIL) THEN  db.Close;
end;

procedure TForm1.SecondCloseClick(Sender: TObject);
var db:TDatabase;
begin
  db:=session.FindDatabase(’MSSQL2);
  IF (DB<>NIL) THEN
    db.Close;
end;

Session调用Opendatabase方法打开与别名为MSSQL1的数据库的连接(连接的是Microsoft SQL Server中的数据库pubs)并返回database对象给database1,打开别名为MSSQL2(连接Microsoft SQL Server中的数据库Northwind)并返回database对象给database2,用FindDatabase方法找到别名为MSSQL1和MSSQL2的数据库,返回给临时数据库对象db,并使用TDatabase组件的Close方法关闭数据库连接。

2、在程序中操纵数据库
   
  (1)建立查询并使其结果集可编辑
当需要对查询结果进行编辑时,可用TQuery或TStoredProc组件并结合TUpdataSQL组件来实现。TQuery或TStoredProc的CachedUptates为True,表示可进行缓存编辑, UpdateObject属性为设置某TUpdateSQL对象,如UpdateSQL1;UpdateSQL1对象的属性DeleteSQL, InsertSQL, ModifySQL是作为编辑查询结果后写入数据库时生成相应SQL语句的参数,可手动设置,也可双击UpdateSQL1对象激活其编辑器进行生成,查询结果可显示在DBGrid1中,并可直接在其上进行编辑,示例代码如下(UpdateSQL1的DeleteSQL,InsertSQL,ModifySQL直接用其编辑器生成,在此不列出):
     procedure TForm1.QueryDisplayClick(Sender: TObject);
     begin
        DataSource1.DataSet:=query1;
       query1.Close;
       query1.CachedUpdates:=True;
       query1.SQL.Clear;            //清除SQL属性
       query1.ParamCheck:=True;
       query1.DatabaseName:=’MSSQL1’;
       query1.SQL.Add(’select * from employee’);
       query1.SQL.Add(’where pub_id>:pubid’);
       query1.SQL.Add(’order by emp_id’);
       query1.ParamByName(’pubid’).AsString:=’1000’;
       query1.Prepare;
       query1.ExecSQL;
    end;
上述代码中,使用query组件的Add方法增加SQL属性,Pubid为动态参数,在执行SQL语句前需对其进行赋值,用ExecSQL方法执行SQL语句,在DBGrid1中对查询结果进行编辑后,可调用ApplyUpdates方法把缓存中的数据写入数据库。
 
(2)动态创建存储过程
Delphi可用Query组件动态创建存储过程。在窗体上放置Query2对象和命令按钮 GreadeProc其代码如下:
procedure TForm1.CreateProcClick(Sender: TObject);
begin
  with Query2 do Begin
    DatabaseName:=’MSSQL1’;
    active:=False;
    paramcheck:=False;
    with SQL do Begin
      Clear;
      Add(’Create Procedure get_maxname’);
      Add(’@max_name char(20) output’);
      Add(’As’);
      Add(’select @max_name=max(au_fname)’);
      Add(’from authors’);
    end;
    ExecSQL;
  end;
end;
代码中因执行的是非查询语句,所以Paramcheck属性必须设置为False,@maxnarme为存储过程的输出参数,用ExecSQL方法执行SQL语句。

(3)使用带参数的存储过程
如存储过程返回的结果为一数据集,则使用方法与Tquery组件相似,下面是使用上面新建立的存储过程。在窗体上放置StoredProc1对象,其属性如下:
DatabaseName=’MSSQL1’
StoredProcName=’dbo.get_maxname’
Param.Date=<
Item
DateType=ftstrying // 参数的数据类型
Name=’@max_name’ // 参数名
ParamType=ptOutPut // 参数为输出参数
End>
在窗体上放置命令按钮WithReturnProc, 其相应代码如下:
procedure TForm1.WithReturnProcClick(Sender: TObject);
var tempStr:String;
begin
  StoredProc2.Prepare;
  StoredProc2.ExecProc;
  tempStr:= StoredProc2.ParamByName(’@max_name’).AsString;
  showmessage(’The value of StoreProc returned is ’+tempStr);
end;

StoredProc组件使用ExecProc方法执行存储过程,使用ParamByName方法访问输出参数‘@max_name’。
(4)事务控制
Delphi通过Database组件可进行全面的事务控制。使用Database的StartTransaction启动一新事务,用Commit方法提交数据,用Rol1back方法卷回事务,取消对数据库所做的修改。例如,需把上面编辑过的数据从缓存提交给数据库,可用如下代码:
procedure TForm1.QueryApplyClick(Sender: TObject);
begin
  with Query1 do
  begin
      Database1.StartTransaction;
    try
        ApplyUpdates;   //写入数据库
        Database1.Commit; //写入成功,提交事务
    except
        Database1.Rollback; //写入失败,取消修改
        raise;
      end;
  CommitUpdates; //写入成功后,清除数据库缓存
  end;
end;

本文中的所有应用程序均可在机上正确运行,只是由于篇幅有限,详细的事件代码在此不一一列出。此外,Delphi数据库应用开发的其他方面,诸如多层应用程序开发、分布式应用编程、ADO编程等,只有在不断实践中才能逐渐了解其博大精深之处,在此就不赘述。
原创粉丝点击