关于我在写数据库程序中的一些思路,各位富翁发表一下意见.(300分)

J

jbas

Unregistered / Unconfirmed
GUEST, unregistred user!
各位富翁:
  我在编写数据库应用程序时,用的是下面的思路,大家讨论一下它的优缺点。
采用不是非常完美的oop.没有继承。大概思路:
多个访问datamod数据单元的单元,用多个单元主要是为了清楚的把访问各个模块的函数分开。
例如:
系统单元主要用来实现系统级的操作,如初始化系统,连接ADO,ODBC,BDE操作,系统密码
修改,操作者管理等.
以UntClassSystem单元为例,其它单元一样。
单元结构:
unit UntClassSystem;

interface
uses ADODB,Classes,UntDb,SysUtils,DB;

type
UserAndPview=record //用户权限信息.
UserName:string;
PrView:string;
end;
ArrUserAndPview=array of UserAndPview;

TSystemClass=class
private
FADOQuery:TADOQuery;
function PJudgeUserAlready(AUser:string):boolean;
public
PubADOQuery:TADOQuery;
function ClassSystem_CheckUser(AUser,APassword:string):boolean;
function ClassSystem_ChangPass(AUser,AOldPass,ANewPass:string):boolean;
function ClassSystem_ShowAllUser:ArrUserAndPview;
Constructor Create(AOwner:TComponent);
Destructor Destroy;override;
end;

implementation

{ TSystemClass }

.......
constructor TSystemClass.Create(AOwner: TComponent);
begin
inherited Create;
FADOQuery:=TADOQuery.Create(nil);
FADOQuery.Connection:=UntDb.DataMod.ADOConn; //连接ADOConnection.
PubADOQuery:=TADOQuery.Create(nil);
PubADOQuery.Connection:=UntDb.DataMod.ADOConn;
end;

destructor TSystemClass.Destroy;
begin
FADOQuery.Free;
PubADOQuery.Free;
inherited;
end;
......
function TSystemClass.ClassSystem_ChangPass(AUser, AOldPass,
ANewPass: string): boolean;
begin
with FADOQuery do
begin
close;
sql.Clear;
sql.Add('exec ChgPass(name,oldpass,newpass)');//调用存储过程.
parameters.ParamByName('name').Value:=auser;
parameters.ParamByName('oldpass').Value:=aoldpass;
parameters.ParamByName('newpass').Value:=anewpass;
try
execsql;
result:=true;
except
raise exception.Create('Error,ClassSystem_ChangPass!');
end;
end;
end;
........

界面中调用其单元中的函数。
unit UntChgPass;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls,UntClassSystem;

type
TFrmChgPass = class(TForm)
procedure BtnOkClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
PSystemClass:TSystemClass;
public
{ Public declarations }
end;

var
FrmChgPass: TFrmChgPass;

implementation
uses UntGlobal;
{$R *.dfm}
.......
procedure buttonclick(sender:TObject);
begin
if PsystemClass.ClassSystem_ChangPass(Glb_Use_name,EdtOld.Text,EdtNew.Text)=true then
....
end;

procedure TFrmChgPass.FormCreate(Sender: TObject);
begin
PSystemClass:=TSystemClass.Create(nil);
end;

procedure TFrmChgPass.FormClose(Sender: TObject; var Action: TCloseAction);
begin
PSystemClass.Free;
end;

end.

上面PSystemClass在FormCreate中申明,各个事件中都可以不申明就用.
form close事件中Free PSystemClass;
在PSystemClass单元中的函数以数组的形式返回值给界面,界面中再处理那些数组.不用数据感知控件。
....
datamod单元结构:
unit UntDb;

interface

uses
SysUtils, Classes, DB, ADODB,Inifiles;

type
TDataMod = class(TDataModule)
ADOConn: TADOConnection;
procedure DataModuleCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
PDataSource:TDataSource;
end;

var
DataMod: TDataMod;

implementation
uses UntGlobal;
{$R *.dfm}

procedure TDataMod.DataModuleCreate(Sender: TObject);
var
ConnIniFile:Tinifile;
ConnStr:Widestring;
IniFileStr:string;
begin
IniFileStr:=extractfilepath(paramstr(0))+'ConfigTool/CSerCf.ini';
try
ConnIniFile:=Tinifile.Create(IniFileStr);
ConnStr:=ConnIniFile.ReadString('SerVerConfig','ConnectionString','');
ADOConn.ConnectionString:=ConnStr;
ADOConn.LoginPrompt:=false;
ADOConn.Open;
except
Raise exception.Create('连接字符串出错!');
end;
ConnIniFile.Free;
end;

end.

各位富翁发表一下意见,效率怎样?结构怎样?.....?有说的不清楚的我再写.谢谢了。
 
程序流程还是比较清楚,有点oop了
 
谢谢土土了,各位其它的富翁难道没有什么看法吗?说说吗,不要这么小气了。
 
"采用多个数据模板的形式把业务规则分开,然后在数据模板中定义方法,来执行具体的
数据操作".我也是这样定义的,我认为数据库程序的开发,因为与业务流程联系较紧,所以不
太容易封装成类,然后继承并重用它,顶多也就是二次开发或再次开发同类型软件时有些代码
可以重用.
不过关于数据感知控件的使用,我认为如果项目大到一定程度或开发时间也有限的情况下,
那还是要用的,不然自己在代码中控制数据的提交,那代码量就更大了.
 
关于数据感知控件的使用,也可以通过函数来返回DataSource的,界面程序中调用。
class中:
function TSystemClass.ClassSystem_ShowRyBmDh: TDataSource;
begin
result:=TDataSource.Create(nil);
with FADOQuery do
begin
close;
sql.Clear;
sql.Add('select * from BMTXB');
try
open;
result.DataSet:=FADOQuery;
except
raise exception.Create('Error,ClassSystem_ShowRyjl');
end;
end;

end;
界面中:
procedure TFrmSwRyjl.FormCreate(Sender: TObject);
begin
PSystemClass:=TSystemClass.Create(nil);
DBGrd.datasource:=PSystemClass.ClassSystem_ShowRyjl;
DBGrd.Columns[0].FieldName:='RYNAME';
DBGrd.Columns[1].FieldName:='RYPHONE';
DBGrd.Columns[2].FieldName:='RYBP';
DBGrd.Columns[3].FieldName:='RYMOB';
end;
这样也算是通过函数的调用吧,以后改也方便。
大家继续。。。。
 
写的的确是不错,
我的感受就是写程序的时候,特别是对数据的编辑(删除,修改,添加)
,尽量使用SQL语句来完成是最好的,我就碰到过在DELPHI中使用参数
结果把很小的表给锁住了(不用参数,直接用字符串来组合是最好的).
楼主继续吧.我们一起讨论.
 
这张贴子得花时间看,标记一下。
 
看一看再说
 
分数据模块是必须的,
有利于减小程序尺寸,
最重要的能作到通用,比如说你下次要再开发一套新系统时,
能很方便把这些数据模块提出来,
所有每个模块应该没有联系
 
写的挺好的,收藏细品!
 
没仔细看,不过代码不是很规范。
 
http://61.132.118.185:8080/dispdocnew.php?t=27&id=4261
有代码。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
499
import
I
I
回复
0
查看
568
import
I
顶部