改C/S:
在软件里加入合适的权限控制,再共享下数据库,程序的里执行语句处理下并发情况,加入事物回滚操作,基本就OK了。。
1. 最简单的, 服务器只做数据服务器, 改下数据库连接;
2. C/S跟单机的区别在于共享服务器资源(包括业务逻辑、数据等多种资源),此时关键需要考虑的一点,在这种情况下,服务器通常需要考虑到的是如何避免对数据做访问时的冲突性。这也主要在于服务器设计为多线程服务。其它的跟单机没啥区别,至于楼上说到的比如服务器做为业务(逻辑)层,这主要在于一个是节省成本,例如大量数据运算放到的服务器,从而降低诸多客户端软件硬件环境的需求,当然也就加大了服务器的配置需求,同时也便于维护的集中化,数据的统一化,同时也更便于数据分析统计等操作,同时在一定合理设计方案下,服务器与客户端之间的交互量相对来说比较小,主要集中在有效数据的传输,而无须更多的做参与运算逻辑的中间数据的交互。
另一种设计则是分布式处理,相对前一种而言则正好相反,它主要是把服务器做为数据存储器使用,而业务逻辑则由诸多客户端来完成,这个则相对主要降低了对服务器的配置需求,并且同时更为合理的利用客户端的计算机能力及资源。不管是如何设计,这当中不可免去的是服务器端数据的访问冲突性管理。对数据库比较了解的朋友应该懂得数据库当中通常都会有一个锁的概念。这是为了数据的统一保障性而设计的。更多的还是看看书吧。
利用Delphi实现两层C/S数据库应用程序设计
关键词 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);begindatabase1:=session.OpenDatabase(’MSSQL1’);end;
procedure TForm1.SecondOpenClick(Sender: TObject);begindatabase2:=session.OpenDatabase(’MSSQL2’);end;
procedure TForm1.FirstCloseClick(Sender: TObject);var db:TDatabase;begindb:=session.FindDatabase(’MSSQL1’); //查找是否有以MSSQL1为别名的database对象IF (DB<>NIL) THEN db.Close;end;
procedure TForm1.SecondCloseClick(Sender: TObject);var db:TDatabase;begindb:=session.FindDatabase(’MSSQL2);IF (DB<>NIL) THENdb.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);beginDataSource1.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);beginwith Query2 do BeginDatabaseName:=’MSSQL1’;active:=False;paramcheck:=False;with SQL do BeginClear;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=<ItemDateType=ftstrying // 参数的数据类型Name=’@max_name’ // 参数名ParamType=ptOutPut // 参数为输出参数End>在窗体上放置命令按钮WithReturnProc, 其相应代码如下:procedure TForm1.WithReturnProcClick(Sender: TObject);var tempStr:String;beginStoredProc2.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);beginwith Query1 dobeginDatabase1.StartTransaction;tryApplyUpdates; //写入数据库Database1.Commit; //写入成功,提交事务exceptDatabase1.Rollback; //写入失败,取消修改raise;end;CommitUpdates; //写入成功后,清除数据库缓存end;end;
本文中的所有应用程序均可在机上正确运行,只是由于篇幅有限,详细的事件代码在此不一一列出。此外,Delphi数据库应用开发的其他方面,诸如多层应用程序开发、分布式应用编程、ADO编程等,只有在不断实践中才能逐渐了解其博大精深之处,在此就不赘述。
-----------------------
