DBGrid使用过程中的简单问题。(100分)

  • 主题发起人 主题发起人 Beast
  • 开始时间 开始时间
这次这个问题解决了就结帖:
有一个视图,使用Union连了两个结构一样的表,其中一个表的数据是固定的,令一个表的数据是需要增删改的。
使用Query打开这个视图
DbGrid连接Query
1、对视图里面的数据删改,怎么做?
2、改动了Query后面的视图中的一个表的数据后怎么使Query自动更新?Resync好像不能用呀?
 
简单来说,一条Update语句只能更改一个表,也就是说是说不管ADOQuery或Query或Table
本质上来说都是一样的,我知道几种做法可以实现你的需求:
1.直接写SQL语句在更新时进行控制,但这种方法我是用TClientDataSet+TProvider+TDataSet
实现的,可以在更新时通过自定意的Sql语句进行控制
2.如果不要求实现对增加记录的更新,可以实现Update一个视图的,也就是说如果你的结果集
只发生数据变动,而不是记录的增加和减少,用TDataSet(如AdoQuery,Query等)都是可直接更改的
,单要求被更改的表主关键字与视图一致,简单来说就是被更改的表与视图是1对1的关系
3.直接根据TDataSet内的记录变化状态自己形成SQL语句来操作,因为从本质来说,任何TDataSet组件
最后都是通过Sql语句来读写数据库的
4.如果你不用视图而直接用他们的连接查询语句可以用TClientDataSet+TProvider+TDataSet这种方式
实现自动更改(包括增删改),但前提是A.单要求被更改的表主关键字与查询结果一致,简单来说就是被更改
的表与查询结果集是1对1的关系 B.你写TDataSet(TadoQuery或Query)的语言句时最后的Select ?? From ??
时from后的第一个表名必须是你要更改的表的名称,这其实是TProvider的一个内在Bug,它只更新From后面的
表名的表的数据,我们正好可以利用这个Bug来实现多表连接查询中更新某一个表的需求
 
我最后摒弃使用视图,使用查询语句完成。
正如楼上仁兄所言,只会更新第一个From后面的表,就是这样解决的。但是我
认为TProvidor也许是没有BUG的,因为我用的是TQuery。
 
后退
顶部