关于新手第一次写类的疑惑,望指教! (100分)

  • 主题发起人 主题发起人 jbas
  • 开始时间 开始时间
J

jbas

Unregistered / Unconfirmed
GUEST, unregistred user!
我想实现自己写一个类来操作数据的读写。下面是那个类:
但我在程序中这样写却总是出现00000000内存读写错误。
procedure TForm1.Button1Click(Sender: TObject);
var
te:TDbDo;
begin
te:=TDbDo.Create;
te.SQL.Add('sdf');
te.Free;
end;
------------------------------

unit MyDbClass;

interface

uses Controls,ADODB,Classes;

Type
TDbType=record
Arrrq:TDate
//录入日期.
Azgxm:string
//职工姓名.
Azgbh:string
//职工编号.
Assbmmc:string
//所属部门名称.
Assbmbh:string
//所属部门编号.
Ajbgz:currency
//基本工资.
Agl:integer
//工龄.
Aglgz:currency
//工龄工资.
Aylbx:currency
//扣养老保险金.
Afdgz:currency
//浮动工资.
Azfgjj:currency
//住房公积金.
Ajj:currency
//奖金.
Ajbf:currency
//加班费.
Aqqts:integer
//缺勤天数.
Aqqkk:currency
//缺勤扣款.
Azwgz:currency
//职务工资.
Asds:currency
//所得税.
Akkhj:currency
//扣款合计.
Asfhj:currency
//实发合计.
Akcjs:currency
//扣除基数.
Asl:single
//税率%.
Asskcs:currency
//速算扣除数.
Asfdsje:currency
//实发到手金额.
end;
TDbDo=class
private
FDbInfo:TDbType;
FConnectionString: WideString;
FADOQueryDbClass:TADOQuery;
FSQL:TStrings;
FADOConnection:TADOConnection;
function GetSql:TStrings;
procedure SetSql(const Value:TStrings);
procedure SetConnStr(AConnStr:WideString);
protected
public
constructor Create;
destructor Destroy
override;
procedure calc;
published
property ConnectionStr:WideString read FConnectionString write SetConnStr;
property SQL:TStrings read GetSql write SetSql;
end;

implementation

{ TDbDo }

procedure TDbDo.calc;
begin
FADOQueryDbClass.SQL.Assign(SQL);
try
FADOQueryDbClass.Open;
except
FADOQueryDbClass.execsql;
end;
end;

constructor TDbDo.Create;
begin
inherited Create;
FADOConnection:=TADOConnection.Create(nil);
FADOQueryDbClass:=TADOQuery.Create(nil);
FADOQueryDbClass.Connection:=FADOConnection;
end;

destructor TDbDo.Destroy;
begin
FADOConnection.Free;
FADOQueryDbClass.Free;
inherited;
end;

function TDbDo.GetSql: TStrings;
begin
result:=FSQL;
end;

procedure TDbDo.SetConnStr(AConnStr: WideString);
begin
if FConnectionString<>AConnStr then
FConnectionString:=AConnStr;
end;

procedure TDbDo.SetSql(const Value: TStrings);
begin
FSQL.Assign(Value);
end;

end.

 
TDbDo.Create中加上一句:
FSQL:=TStringList.Create;
TDbDo.Destroy中加上一句:
FSql.free;
 
同意楼上的,FSQL没有被创建
 
谢谢了,可以了!Shuzi,(先给你50分)
可是这100分是我全部分数的一半,真舍不得,各位能不能在提点用类来操作数据库程序的
经验呀。
 
真不知道为什么要用类来实现,如果有改动,可能非常累的。
不要为了OOP而OOP
 
谢谢 djdsz的关注!
因为我以前写的几个模块(人事管理,部门管理)中没有用到类,只有一个data module
把一些函数全部写在了里面,要一个写一个。所以也分不清是哪个模块的函数了,也觉的
以后要是改动一个模块的话,光找函数就非常麻烦,所以想把操作各个模块的不同的方法
都集中在一个文件中,我想这个可以用类来实现吧?相同的方法还是放在data module中(是不是也不用放,可以继承什么的???)
还有就是那些个query控件,如果对付insert,delete,update等方法,可以用动态生成的方法,用完
就释放,可以不用data source控件,不会更其他数据冲突,但是如果select等语句,用了
data source控件的,需要长时间保持数据的,就不能立刻释放掉了,必须到form的close
方法中去释放申请的query,data source申请的空间。从而必须记住select中用到的query的名称
这样总觉的不好,不独立。如果用类来实现,可以把类当变量,类里面包括query,datasourc,
connection.就可以用一个类的对象来实现,所有的query,datasource,connection都包括在
类里面了,我只要把类的对象释放掉,就全都释放掉了。如果需要长时间保持数据也可以了,
不要的时候就释放掉类就可以了,而不必具体记住哪个query,datasource,connection了。
而且可以同时申请多个类的对象,而这些类的对象都彼此不冲突。
例如:
var a,b,c:tmyclass;
这样也就不需为在同一个form上显示两个数据源而开两个data source了。只需申请两个tmyclass就可以了!
上面的都是我自己的理解,可以说想当然,但我正是要这样去干去。高手门指正一下。谢谢了!
如果有我有什么没说明白的请告一声,我再说。
上面所说的》》如果有改动,可能非常累的。
为什么呀?能否简单的举个例子。


 
constructor TDbDo.Create;
begin
inherited Create;
FADOConnection:=TADOConnection.Create(nil);
FADOQueryDbClass:=TADOQuery.Create(nil);
FADOQueryDbClass.Connection:=FADOConnection;
FSQL := Tstringlist.Create;//加上;
end;
 
各位高手能不能发表一下你们在数据库编程中怎样用oop吗?
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1061399
有高手的讨论!
呵.高手跟高手讨论,挺热闹。跟新手讨论,就.......(好象也讨论不出什么.:))
 
后退
顶部