我欲将数据库表封装在类里,但不知效果如何.请大侠看看,有不到之处,多提宝贵意见.
一种方法是将表完全封装在类里,另外一种是提供对数据库表的接口,用的时候再调用,
如:要获得某表的用户名单,有两种方法,
一种是: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.
解决方案 »
- wParam类型如何输入到EDIT1?
- 300分求解个问题!解决后立马给分!(说到做到!)
- ★极度郁闷中,作程序员的我年纪大了以后怎么办呀???
- 文件为何无法删除?
- 关于dbexpress的事务处理问题
- 请问如何制作一个chm文件
- 有没有那个函数可以检测到鼠标在字符串中的位置
- installshield professional6.22安装时的password??????????
- Adodataset和adotable在作用上有什么有什么区别?
- 请问WinAsm32的下载地址,谢谢!
- 关于遍历项目中所有窗体问题
- 熬通宵终于找出了问题点,但无法解决:封装基于TDBDateTimeEditEh的组件后,再往表单上放时就出现错误:Control '' has no parent window.
如果配置很高,机器很快,可以用listBox1.items :=oper2.getList(dataModule1.adoQuery1,'姓名');
如果库慢,可以用listBox1.items :=oper1.getList;