我欲将数据库表封装在类里,但不知效果如何.请大侠看看,有不到之处,多提宝贵意见.
一种方法是将表完全封装在类里,另外一种是提供对数据库表的接口,用的时候再调用,
如:要获得某表的用户名单,有两种方法,
一种是:listBox1.items :=oper1.getList;//数据库表完全封装在类里.
另外一种就是listBox1.items :=oper2.getList(dataModule1.adoQuery1,'姓名');//'姓名'是该表的一个字段.哪种更好?
本虾自学面向对象编程,老想封装数据库表,不知我的做法是否正确,大侠们大力指教.
以下是实际代码,在delphi7+windows98下运行正确.
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,unit2, StdCtrls;type
TForm1 = class(TForm)
ListBox1: TListBox;
ListBox2: TListBox;
Button1: TButton;
procedure FormActivate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
Oper1 :TOper;
oper2 :TOper2;implementation
uses dataUnit;{$R *.dfm}procedure TForm1.FormActivate(Sender: TObject);
begin
oper1 :=TOper.create(nil);
with dataModule1.ADOQuery2 do begin
SQl.Clear;
SQL.Add('select * from 用户');
open;
end;
oper2 :=TOper2.create(nil);
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
oper1.Free;
oper2.Free;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
listBox1.Items :=oper1.getList;
listBox2.Items :=oper2.getList(dataModule1.ADOQuery2,'姓名');
end;end.-----------------------------unit Unit2;interface
uses DB,ADODB,classes;type
TOper =class(TDataset)
private
query :TADOQuery;
FList :TStringList;
public
constructor create(Owener: TComponent);override;
destructor destroy;override;
function getList: TStringList;
end; TOper2 =class(TDataset)
private
FList :TStringList;
public
constructor create(Owener: TComponent);override;
destructor destroy;override;
function getList(aQuery: TADOQuery;aField: String):TStringList;
end;
implementation
uses dataUnit;{ TOper2 }constructor TOper2.create;
begin
inherited;
FList :=TStringList.Create;
end;destructor TOper2.destroy;
begin
FList.Free;
end;function TOper2.getList(aQuery: TADOQuery; aField: String): TStringList;
begin
FList.Clear;
with aQuery do begin
first;
while not eof do begin
FList.Add(fieldByName('姓名').Value );
next;
end;
end;
result :=FList;
end;{ TOper }constructor TOper.create;
begin
inherited;
FList :=TStringList.Create;
with query do begin
query :=dataModule1.ADOQuery1;
query.SQl.Clear;
query.SQL.Add('select * from 用户');
query.open;
end;
end;destructor TOper.destroy;
begin
FList.free;
end;function TOper.getList: TStringList;
begin
FList.Clear;
with query do begin
first;
while not eof do begin
FList.Add(fieldByName('姓名').Value );
next;
end;
end;
result :=FList;
end;end.
一种方法是将表完全封装在类里,另外一种是提供对数据库表的接口,用的时候再调用,
如:要获得某表的用户名单,有两种方法,
一种是:listBox1.items :=oper1.getList;//数据库表完全封装在类里.
另外一种就是listBox1.items :=oper2.getList(dataModule1.adoQuery1,'姓名');//'姓名'是该表的一个字段.哪种更好?
本虾自学面向对象编程,老想封装数据库表,不知我的做法是否正确,大侠们大力指教.
以下是实际代码,在delphi7+windows98下运行正确.
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,unit2, StdCtrls;type
TForm1 = class(TForm)
ListBox1: TListBox;
ListBox2: TListBox;
Button1: TButton;
procedure FormActivate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
Oper1 :TOper;
oper2 :TOper2;implementation
uses dataUnit;{$R *.dfm}procedure TForm1.FormActivate(Sender: TObject);
begin
oper1 :=TOper.create(nil);
with dataModule1.ADOQuery2 do begin
SQl.Clear;
SQL.Add('select * from 用户');
open;
end;
oper2 :=TOper2.create(nil);
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
oper1.Free;
oper2.Free;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
listBox1.Items :=oper1.getList;
listBox2.Items :=oper2.getList(dataModule1.ADOQuery2,'姓名');
end;end.-----------------------------unit Unit2;interface
uses DB,ADODB,classes;type
TOper =class(TDataset)
private
query :TADOQuery;
FList :TStringList;
public
constructor create(Owener: TComponent);override;
destructor destroy;override;
function getList: TStringList;
end; TOper2 =class(TDataset)
private
FList :TStringList;
public
constructor create(Owener: TComponent);override;
destructor destroy;override;
function getList(aQuery: TADOQuery;aField: String):TStringList;
end;
implementation
uses dataUnit;{ TOper2 }constructor TOper2.create;
begin
inherited;
FList :=TStringList.Create;
end;destructor TOper2.destroy;
begin
FList.Free;
end;function TOper2.getList(aQuery: TADOQuery; aField: String): TStringList;
begin
FList.Clear;
with aQuery do begin
first;
while not eof do begin
FList.Add(fieldByName('姓名').Value );
next;
end;
end;
result :=FList;
end;{ TOper }constructor TOper.create;
begin
inherited;
FList :=TStringList.Create;
with query do begin
query :=dataModule1.ADOQuery1;
query.SQl.Clear;
query.SQL.Add('select * from 用户');
query.open;
end;
end;destructor TOper.destroy;
begin
FList.free;
end;function TOper.getList: TStringList;
begin
FList.Clear;
with query do begin
first;
while not eof do begin
FList.Add(fieldByName('姓名').Value );
next;
end;
end;
result :=FList;
end;end.
解决方案 »
- 问题小白:不懂delphi的属性
- delphi多表查询.
- 开帖散分,8/10[铁公鸡拨毛]
- 如何获得网站主页文件名或地址重定向以后的文件名
- Delphi中一个非常困惑的问题
- 听说这编程的高手有相当一部分是从玩游戏启蒙的,现调查一下,往各位大哥大姐,大弟大妹,多多捧场。
- 这么晚了,喝点可乐提提神
- 注册码问题,UP有分。
- 还是下面的问题,我如何判断form2已创建过???
- 请问什么地方有BDE下载,如何查看本机BDE的版本?
- 关于遍历项目中所有窗体问题
- 熬通宵终于找出了问题点,但无法解决:封装基于TDBDateTimeEditEh的组件后,再往表单上放时就出现错误:Control '' has no parent window.
如果配置很高,机器很快,可以用listBox1.items :=oper2.getList(dataModule1.adoQuery1,'姓名');
如果库慢,可以用listBox1.items :=oper1.getList;