请教数据集的使用(30分)

  • 主题发起人 主题发起人 yubo
  • 开始时间 开始时间
Y

yubo

Unregistered / Unconfirmed
GUEST, unregistred user!
我作的程序用到的表非常多.(八十多)
请较大家数据集应怎么使用(如:都放在数据模块上、动态创建)
现在我是放在数据模块上,一个表一个Table,数据模块很大
请大家给我一些帮助
 
这可能要看根据实际情况决定,但是原则上有相互关系的表应当放在一块
我初学DELPHI时,师兄就强调过一点“数据管数据、控制管控制”,就是
说数据之间的相互关系最好写在表和字段触发器中,不要和操作界面的限制
染到一块。
如果你需要大量的字段触发器来描述表之间的相互关系,可能就不方便动态
创建了。
 
建议使用Tquery!!
这样可以把一些。。。。只用一个或少数几个Query, 使用时
Query1.Close;
Query1.SQL.CLEAR;
Query1.sqL.Add(Select * XXX From );
Query1.open;

但是必须注意,保证使用该Query 时, 不会被其他 干扰!!!!!!!
切记!切记切记切记切记切记!
 

我觉得yubo的意思只是想少用几个Table控件。可能每个操作界面只用到一两个表,
可以在用到某几个表的时候改变数据模块里的Table控件的TableName属性,这样总的
Table控件数就可以只要几个就够了。当然用这种方法的话有些复杂一些的功能就难以
实现,但对一些功能比较简单的表却完全可以用这种方法合并Table控件。
 
driver:
能不能给我解释一下,'相互关系'、'字段触发器'指的是什么我不太理解
是不是数据的操作和数据集的事件?
pie:

>>但是必须注意,保证使用该Query 时, 不会被其他 干扰!!!!!!!
什么意思?!用Query的话数据录入是不是不如Table方便。
xinhe:
我要在数据集的事件中写代码,不就不好办了?!
 
可以动态创建TTable或TQuery
创建之后,给属性付值即可。这样编码会多一些。
或多建几个datamodule,将你的表分类,放在不同的datamodule上。

我觉得你可以灵活使用上述方法,不必太约束自己。
 
说说我总结的几个准则

1. 涉及到要使用dataset*datasource*data_aware control ,包括输入,修改,删除一体化的
界面。
1.1 全面了解dataset*datasource*data_aware control的borland数据管理体系,能在事件内
处理的尽可能在事件内处理,而不是在体系之外控制体系之内.
2. 全部dataset*datasource都放在一个datamodule内
3. 不使用data_aware control的界面,如treeview,listview,edit,listbox等,尽量
使用query,包括insert,update,delete
4. 简单的不涉及到界面同步只使用的操作,使用query
5. 作为3,4的query,只使用一个TQuery
6. 在使用TQuery时要注意,当一个函数在使用这个query的数据集时,不要调用其他可能
影响这个数据集的状态,位置的函数,这就是pie所说的
>>>但是必须注意,保证使用该Query 时, 不会被其他 干扰!!!!!!!<<<

>>>可以动态创建TTable或TQuery,创建之后,给属性付值即可。这样编码会多一些,<<<
--代码一起归自己控制是每个程序员的理想,但是
对于大量使用dataset*datasource*data_aware control实际上是不现实的,工作量太大
这只适合单一的数据操作.我曾经在一个少量的,小界面的程序内这样作,效果很好,但是在
二个MIS内应用这一套,被碰的头破血流,最后还是回到borland的DB -VCL中
--borland在这个数据体系内封装了大量代码,我们没有理由不使用,也不能认为我们会比他
做的更好.
--<<delphi4核心技术>>是专门介绍它,可以看一看,可以少作很多工作,磨刀不误砍柴工吗?

我写的一个函数,在我的程序内大量使用,配合3,4,5,6很简单,也很方便

function helpExecuteSql (sSql:String;haveResultSet : boolean = true) : TDataSet ;
begin
with dm.ADOQuery do
begin
Close ; sql.Clear ;
sql.add(sSql);
if haveResultSet then
Open else ExecSql ;
end;
if haveResultSet then
Result := dm.ADOQuery else
Result := nil ;
end;

 
<>内为dephi4核心技术,一本书
 
我的意思是,对一个TQuery,用的时候动态添加SQL语句,然后OPEN,使用完成就可以关闭了,
比如
QueryTemp.Close;
QueryTemp.SQL.Clear;
QueryTemp.SQL.Add('select MAX(MGZNO) From TMGZ');
QueryTemp.open;
ii :=QueryTemp.FieldbyName('MAX').AsInteger;
你就可以用来取编号的最大值, 取值完以后就可以随他去了,
然而,如果你执行:
QueryTemp.Close;
QueryTemp.SQL.Clear;
QueryTemp.SQL.Add('select MAX(MGZNO) From TMGZ');
QueryTemp.open;
然后没有执行 ii :=QueryTemp.FieldbyName('MAX').AsInteger;
别的的地方又将 QueryTemp.Close;
QueryTemp.SQL.Clear;
QueryTemp.SQL.Add('select count(*) From TMGZ');
QueryTemp.open;
这时候在执行 ii :=QueryTemp.FieldbyName('MAX').AsInteger;
显然要出错了!
//---------------

对于
>- 用Query的话数据录入是不是不如Table方便
使用Query的话数据录入是, 要注意:
1. Query1.RequestLive 必须为 True;
2. Query1添加数据后,好像只能Query1.Close; 再Query1.open; 添加的数据才能显示出来。
3. 如果Query1.的SQL 语句里包含 WHERE 子句会出现“'Capability not supported.'”错误,
可以使用TUpdateSQL控件来解决!(TUpdateSQL同时也能解决2.的毛病)


 
动态创建的数据集也在datamodule上吗?

关于数据集的事件,不放datamodule上,在各自的窗体上,
动态给句柄赋值是否合适?这样做有坏处吗?
 
多人接受答案了。
 
后退
顶部