ADO连接SQL Server,使用触发器时出现的问题!!!!(300分)(300分)

  • 主题发起人 主题发起人 rongyujohny
  • 开始时间 开始时间
R

rongyujohny

Unregistered / Unconfirmed
GUEST, unregistred user!
前台使用ADO连接SQL Server,现举例说清楚出现的问题:
A表有一新增触发器,在触发器里会对B表新增一些记录。
现在前台Grid里新增A表记录,保存时候出现的ID值为456(而A表实际在后台的ID是127),
这个456实际上是新增B表时最后一条产生的ID值。这样就造成了前后台不一致,就出现了
无法定位问题!
出现此问题原因是:ADO增加记录时返回的ID是通过SELECT @@IDENTITY命令取的,所以
给A表新增记录的ID是最后的@@IDENTITY值,也就是新增B表时最后一条产生的ID值456。
现说出问题大概原因,希望ADO高手帮我解决!!!!小弟不甚感激!!
 
SELECT Max(ID) from A 呢
 
呵呵,我说的不够明白,还是你理解错了!
那ID是保存后自动返回到新增记录的ID列啊,还Select?如何Select?
 
看是不是Sql server的权限设置问题
 
权限是没问题!是ADO问题,我跟踪过,希望ADO高手继续指点!!
 
能把你对B表新增一些记录的触发器的代码贴出来吗?我想不应该出现SELECT @@IDENTITY的
问题的.不管两个表是有自增长列还是没有.
 
@@IDENTITY是全局变量,B表新增时候肯定它的值在变,最后Select回来的肯定是B表的最后
ID值,我认为问题是出现在这里。
代码实际上就是在A表的新增触发器里对B表新增记录而已。
 
在添加B记录之前先把@@identity取出来,然后再添加A记录?
 
你可以说是Ado的Bug,也可以说是你数据库设计的问题,把B中的IDENTITY字段去掉吧,好像
暂时也没有别的方法了,要么你在A的新增后重新刷新
 
To Adnil
@@Identity是ADO内部自己取出来,不是我能控制的。
To 0738
去掉ID字段,那如何定位,用所有字段定位?我想这不是解决问题的好方法;
新增后刷新确实想过,不过如果在用户新增一条记录都要刷新一次,那带来的不良
后果更大。
谢谢指点。
To All
多谢大家指点,希望更多高手继续指教!!
 
你还没有明白我的意思吗?

你现在是不是这样一个流程, ado执行insert into添加记录(插入表A,执行触发器,插入表B),ado执行select @@identity,
这样取到的自然是表B的了。

为何不换种方式,例如通过存储过程? 上述问题自然迎刃而解。
 
你用A的TableName和对应的ID两个字段定位不就可以了吗?并不一定要用IDENTITY字段定位的
 
這確實是個問題,因為@@Identity是SQL的全局變量,你是不能控制的.如果你用觸發器的話,應該不可能得到A 的@@Identity.
 
@@Identity一定要这样用吗?要懂变通啊。改种方式,自己定义一个ID,自己程序控制累加就不会出错了
 
你向B表添加记录的的语句放进一个SP里面,在A的触发器中执行这个SP试过吗?
 
To Adnil
谢谢指导,用存储过程跟触发器实现是两个不同思路,存储过程确实没有这个问题。
但是我是希望在触发器里能不能有好的方法避免这个前后台不一致的问题。
To snjat:
这个方法我想到过(我是设置ID字段默认值为我的自动递增函数取得值)。
测试结果:新增记录,按保存后ID返回前台的值是0(后台是函数返回的值),又是
前后台ID不对,又回到了原问题。
To Beast:
存储过程执行新增时候,一样改变了@@IDENTITY的值啊!
 
是不是执行顺序和没有COMMIT的问题
 
To snjat
执行顺序,什么执行顺序?
应该不存在COMMIT问题
 
更新不及时,取到了脏数据,
执行顺序:你新增后,是否确定,数据已经存入数据库,然后再触发
你用的是before还是after
 
后退
顶部