SQLServer2000,表主键为自增长,TADOQuery,在事务中,主表提交成功后,子表提交失败,事务回滚后,再次提交,弹出错误对话框"Row cannot be located for updating. Some values may have been changed since it was last read".如何解决。谢谢。
解决方案 »
- AnsiString与AnsiChar 如何转换?
- 有关jpg加入数据的问题
- 简单问题!
- 如何做出幻灯的效果???
- 请问有没有可以替换TRichEdit的控件,我发现TRichEdit有问题!!!
- 各位高手!请教!
- 如何在delphi程序中判断serversql服务管理器有没有启动?另外怎么控制他呢?
- 怎样给PChar类型的Buffer动态分配空间?
- 高分求解COM+接口函数参数问题
- 帮忙啊,简单问题
- 以下错误提示是怎么回事阿
- 兄弟姐妹们请帮帮我。...............................................................................
if not ADOConnection1.InTransaction then
ADOConnection1.BeginTrans;
还有一次是我用触发器将表的数据改变了,也出现了类似的问题,后来是先关闭数据集再
重新打开才解决了问题。 将两个表的结构贴出来看看
重新打开能解决,但是页面上用户输入了很多信息,刷新后数据全部消失。不是好的解决方法
Example:Sql server 的Scriptcreate table TableName
(
Field_1 FieldType primary key default 'XXX',
Field_2 .......................,
.
.
.
Field_N
)
try{
// 开始事务
TADOQuery(dsMasterTable.DataSet).Connection.BeginTrans; // 提交主表
TADOQuery(dsMasterTable.DataSet).UpdateBatch; // 给子表MainID字段赋给主表子增长子段的值, 提交明细
with TADOQuery(dsDetailTable.DataSet) do
begin
First;
while not eof do
begin
Edit;
FieldByName('MainID').AsInteger :=
TADOQuery(dsMasterTable.DataSet).FieldByName('MainID').AsInteger;
Next;
end;
UpdateBatch;
end; //提交事务
TADOQuery(dsMasterTable.DataSet).Connection.CommitTrans;
except on e: Exception do
begin
// 回滚
TADOQuery(dsMasterTable.DataSet).Connection.RollbackTrans;
end;
end;
谢谢
To use batch updating, the CursorType property of the dataset component must be either ctKeySet (the default) or ctStatic and the LockType property must be ltBatchOptimistic.还有就是updateBatch是不是虽然放在事务中,但是被调用的话,实际也已经把数据更新到数据库中了?
你可以在项目中测试以下,就是单步执行,等updatebatch执行完毕后,看数据库中的数据是否已经发生了变化。
第二次事务开始,服务器没有收到这个的语句呀,为什么呀?
1、第一次提交主表成功后,提供明细失败,抛出异常。
2、第二次再提供主表,如果主表更改动,发现的是UPDATE语句;如果没有主表没有改动,第二次主表没有发出任何语句。从表也存在同样问题。
1、先做删除操作,然后再插入一次呀。而且是自己写sql就可以了