ADO 中多表更新的问题?(100分)

  • 主题发起人 主题发起人 MarkWsy
  • 开始时间 开始时间
M

MarkWsy

Unregistered / Unconfirmed
GUEST, unregistred user!
select a.id,a.name,b.bmmc
from a left join b on a.bmdm = b.bmdm
where a.id = 1

其中ID是键值,使用TADOQUERY时,若执行UPDATE,没有问题,
但INSERT时,则数据同时向a表及b表INSERT,若只希望INSERT a 表,设置
a的AFTEROPEN事件:

a.recordset.properties.item['unique table'].value := 'a' ;

无效,还是发出了两条SQL语句。

这是怎么回事?
 
在ADOQuery中取固定列,选择不需要更新的列,设置ProviderFlags为false
 
还是不行。

我新建了所有的静态字段,设置其中的bmmc的UPDATE为FALSE,还是发了两条INSERT。

一条往A,一条往B。
 
多表join来的就是这样.
李维说了,还是自己写update和Delete语句更新吧.
想想ADO比IBX方便这么多,人家微软的引擎都帮你在后面做了很多的事啊
 
ADO的技术文档都说可以,怎么还是不行?

见下:


使用户能够直接控制在通过对多个基本表执行 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 集合中。
 
你的问题我也碰到过:(我的数据库是SQL SERVER)
a.recordset.properties.item['unique table'].value := 'a' ;
只对UPDATE起作用;
另需将b表的所有字段的ProviderFlags中的frinUpdate设为false,
这样可以在删除和增加时保证只对a表进行操作.
如有问题:请E-MAIL:zhang@chinalanya.com,QQ:64632053
 
你的问题我也碰到过:(我的数据库是SQL SERVER)
a.recordset.properties.item['unique table'].value := 'a' ;
只对UPDATE起作用;
另需将b表的所有字段的ProviderFlags中的pfinUpdate设为false,
这样可以在删除和增加时保证只对a表进行操作.
如有问题:请E-MAIL:zhang@chinalanya.com,QQ:64632053
 
象这种情况,最好是加个计算字段,不用联表。
 
(一)新建一个项目,放置TADOQUERY,两个DBEDIT,用于显示SHIPNAME及LASTNAME,
一个DBNAVIGATOR

(二)这是我利用SQL附带的NORTHWIND的数据库重新测试的SQL语句:
select a.orderid,a.employeeid,a.shipname,b.lastname
from orders a left join employees b on a.employeeid = b.employeeid
where a.orderid = 10248

(三)设置TQUERY1的AFTEROPEN事件:
TADOQuery(DataSet).Recordset.Properties.Item['unique table'].Value := 'orders';

(四)设置四个静态字段,其中ORDERID为pfinKEY为TRUE,LASTNAME为pfinUpdate为FALSE,
保存后,ADO还是自作聪明的往SQL SERVER 发了两条UPDATE语句:

sp_executesql N'UPDATE "Northwind".."orders" SET "shipname"=@P1 WHERE "orderid"=@P2 AND "shipname"=@P3', N'@P1 nvarchar(28),@P2 int,@P3 nvarchar(25)', N'Vins et alcools Chevalier111', 10248, N'Vins et alcools Chevalier'
sp_executesql N'UPDATE "Northwind".."employees" SET "lastname"=@P1 WHERE "lastname"=@P2 AND "EmployeeID"=@P3', N'@P1 nvarchar(17),@P2 nvarchar(13),@P3 int', N'Buchanan111111111', N'Buchanan11111', 5
或是:
sp_executesql N'INSERT INTO "Northwind".."orders" ("shipname") VALUES (@P1)', N'@P1 nvarchar(4)', N'2222'
SELECT @@IDENTITY
sp_executesql N'INSERT INTO "Northwind".."employees" ("lastname") VALUES (@P1)', N'@P1 nvarchar(4)', N'3333'

(五)Why ?
 
同样关注
 
那个汉化的ADO SDK是错误的。
Unique Table动态属性只在Delete时起作用。
Insert,Update时不起作用,这时你不要修改子表字段即可。
zhumoo的方法可以,也可以参考http://web.orbitel.bg/vassil/
 
试试:
//添加一个adoquery控件,命名为adoqueryUpdate
//在adoquery的beforePost事件里写如下代码

procedure TForm1.ADOQueryJHMXBeforePost(DataSet: TDataSet);
begin
if dataset.UpdateStatus=usInserted then //新增记录
begin
adoqueryUpdate.SQL.Text:='insert into jhmx values(:sysno,:hpbh)';
adoqueryUpdate.Parameters.ParamByName('sysno').Value:=
dataset.FieldValues['sysno'];
adoqueryUpdate.Parameters.ParamByName('hpbh').value:=
dataset.FieldValues['hpbh'];
adoqueryUpdate.ExecSQL;
end;
dataset.Cancel;
adoqueryJHMX.Requery;
abort;
end;
 
我很想知道您这个问题是如何解决的呢?
 
设置了要更新的表后, 还需要将不需要更新的字段设为只读.祝你好运
 
后退
顶部