ADO 多表更新问题( 100分相送,在线等待) (100分)

  • 主题发起人 主题发起人 hbwanghua
  • 开始时间 开始时间
H

hbwanghua

Unregistered / Unconfirmed
GUEST, unregistred user!
[限Delphi]因ADO 中使用Lookup字段麻烦且超过两个会出错, 只能打开LookupCache,这样速度很慢。
所以我想用视图的办法解决查找字段的显示。如下:

采购订单BuyPlan (Id为主关键字, No 为外键)
Id, No, Count, Price, Sum
商品资料 Goods (No为主关键字)
No, Name, Type, Unit
表1 与表2 通过 Id关联。
AdoQuery.Sql = 'SELECT A.*, B.Name, B.Type, B.Unit FROM BuyPlan A, Goods B
WHERE A.NO = B.NO'
功能:现在表“商品资料”只是提供为字典的作用, 更新与删除操作只针对表“采购订单”。
出现问题: 1。 只能用缓存更新才能实现, 能不用吗?
2。 删除时会同时删除“商品资料”表。 怎样防止?
3. 怎样刷新?[/blue]
 
我觉得你的这种思路ADO下不行,BDE可以。
你应该试着先先解决Lookup字段的问题
http://delphibbs.com/delphibbs/dispq.asp?lid=1500878
 
碧血剑大佬:
我前面做的系统是用BDE , 所以发现BDE 在这方面还是很不错的, 但李维的书号称ADO
支持多表更新, 我有些迷惑.

 
多表更新是可以的,但它是由ADO驱动完成的,
程序无法控制,无法做到像BDE的UpdateSQL那样随意。
如你的第二个问题 ‘ 删除时会同时删除“商品资料”表。
就无法由ADO自动实现
要不然你就用三层
 
碧血剑大佬:
请问您在用ADO 做数据库开发时, 您采用的是哪种模式? 是用LOOKUP字段还是用视图。
怎么解决?
 
用ADO开发时最好用视图,因为lookup是很浪费的,特别是在做三层系统时,lookup会把整
个查询数据集的资料全都抓到Client端来,太浪费网络,因为会造成网络中的roundtrip太
多了!
 
我更喜欢用SQl自己来更新数据,这样就不会出现所谓的这些问题!
 
To X-Man:
我与您有同感, 但? 以上问题怎样用视图支解决呢?
 
To hpretty:

直接用SQL 是很安全且很自由电信银行都这么做, 但做企业级应用这种模式开发效率太低。
对吗?
 
请高手指教!!!!!!!!!![:)]
 
Unique Table、Unique Schema、Unique Catalog 属性 — 动态


使用户能够直接控制在通过对多个基本表执行 JOIN 操所得到的 Recordset 中的特定基本表的修改。

Unique Table 指定一个允许进行更新、插入和删除的基本表的名称。


Unique Schema 指定模式,即表的所有者的名称。


Unique Catalog 指定目录,即包含表的数据库的名称。
设置和返回值

设置或返回字符串值,该值是表、模式或目录的名称。

说明

所要的基本表通过其目录、模式和表名唯一标识。设置 Unique Table 属性后,可使用 Unique Schema 或 Unique Catalog 属性的值查找基本表。在设置 Unique Table 属性之前需要设置 Unique Schema 和 Unique Catalog 属性的其中一个属性或同时设置两个属性,但这不是必须的。

Unique Table 的主键被用作整个 Recordset 的主键。该键可用于任何需要主键的方法。

设置 Unique Table 后,AddNew、Delete、Resync、Update 和 UpdateBatch 方法只能影响到所命名的表。

如果找不到唯一的基本表,将出现运行时错误。

当把 CursorLocation 属性设置为 adUseClient 时,这些动态属性均被追加到 Recordset 对象的 Properties 集合中。



参考:ADO210.chm中的:ADO动态属性->
 
1.可以不用
2.
AdoDataset.CommandText:='.....';
AdoDataset.Open
AdoDataset.Properties['Unique Table'].Value:=采购订单的表名;
//所有更新,删除,新增只针对采购订单

3.AdoDataset.Close;
AdoDataset.Open;
AdoDataset.Locate(......);//定位到修改或者新增的那一条
//注意AdoDataset.Refresh对SQLServer这种数据服务器是无用的
 
To wbtvc 大哥;
实在不好意思没说清楚, 我讲的是在Delphi 里, 请指教
 
hpretty,shiningplus
困挠很长时间的问题, 终于被二位解决小弟十分感谢!
并感谢 碧血剑, X-man, wbtvc的参于。

有空多交流!

Email: hbwanghua@163.com
 
多人接受答案了。
 
to hbwanghua

如果你是做企业级应用就先做个源码生成器!不就成了?
 
to hpretty:

源码生成器?怎么解释, 请赐教
 
后退
顶部