关于数据库用对象化调用的问题,是否有人用过,请高手指教?(附源码如下) (100分)

  • 主题发起人 主题发起人 liu_sir
  • 开始时间 开始时间
L

liu_sir

Unregistered / Unconfirmed
GUEST, unregistred user!
在datamoudle申明了一个材料库clk对象,用它完成对数据库的处理
type
Tdata1 = class(TDataModule)
ADOConnection1: TADOConnection;
private
{ Private declarations }
public
{ Public declarations }
end;
type
tclk = class
material_name:string;//材料名称
material_no:string; //材料编号
material_type:string;//材料类别
type_no:string; //类别号
material_scale:string;//规格型号
is_equipment:boolean; //是否设备
material_dw:string; //单位
material_number:string;//数量
material_price:string; //价格
material_total:string; //合计
constructor create();//构造
destructor destory(); //销毁
function material_out(material:tclk):tadoquery;//材料出库
function material_in(material:tclk):tadoquery; //材料入库
function material_query():tadoquery;overload; //查询材料类别
function material_query(material_type:string):tadoquery;overload; //查询材料名称
function material_query(material_type:string;material_name:string):tadoquery;overload; //查询规格型号
function material_query(material_type:string;material_name:string;material_scale:string):tadoquery;overload;//查询材料数量
private
adoquery1:tadoquery;

public
end;

var
data1: Tdata1;

implementation

{$R *.DFM}
constructor tclk.create();
//var str1:string;
begin
adoquery1:= tadoquery.Create(application);
//str1:='Provider=SQLOLEDB.1;Password=11;User ID=yxgskfb;Initial Catalog=zndnyxgs;Data Source=wzyz';
//adoquery1.ConnectionString:=str1;
adoquery1.Connection:=data1.ADOConnection1;
end;

destructor tclk.destory();
begin
adoquery1.Free;
end;

function tclk.material_query():tadoquery; //查询材料类别
begin
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('select distinct 材料类别 from clkc');
adoquery1.Open;
result:=adoquery1;
end;

function tclk.material_query(material_type:string):tadoquery; //查询材料名称
begin
adoquery1.Close;
adoquery1.SQL.Clear;
//adoquery1.Connection:=data1.ADOConnection1;
adoquery1.SQL.Add('select distinct 材料名称 from clkc where 材料类别='''+material_type+'''');
adoquery1.Open;
result:=adoquery1;

end;

我对类的编程不是太了解,望高手指教!
 
就这样看,不能判断是什么问题,你把错误的提示贴上来吧:)
 
错误为:adoquery1缺少connection或adoconnection,可我已经在clk.create中附了:
adoquery1.connection:=data1.adoconnection1,请大家不妨试一下
 

clk:=tclk.create();
cx1:=tadoquery.Create(application);
cx1:=clk.material_query;**调用不出问题
combobox1.Items.Clear;
while not cx1.Eof do
begin
combobox1.Items.Add(cx1.Fields[0].AsString);
cx1.Next;
end;
cx1.Free;
//=================================
when you free the TAdoQuery instance,it may be Free the connection Instance
which point to the adoQuery instance's connection, so that ,when you use the
data1.ADOConnection1 , it maybe be free :)
do not free the cx1 instance can make the application run OK;
 
正如wison所言,cx1可能指向adoquery1的地址,cx1.free把adoquery1也释放掉了
该为:
//查询名称
procedure TForm1.ComboBox1Change(Sender: TObject);
var cx1:tadoquery;
begin
cx1:=tadoquery.Create(self);
cx1.clone(clk.material_query(combobox1.items[combobox1.itemindex]));
combobox2.Items.Clear;
while not cx1.Eof do
begin
combobox2.Items.Add(cx1.Fields[0].AsString);
cx1.Next;
end;
cx1.Free;
end;
先送50分与你,嫌me不够慷慨,可提出再加,希望高手指导我一下如何对clk进行编辑,
如添加材料(材料入库),修改材料,以及移动材料指向这些常见操作,与界面结合起来?
 
关于这样做的优缺点以及对象化调用的问题,请大家随便谈谈?
 
多人接受答案了。
 
后退
顶部