TADOQuery连接数据库更新表A后,A被锁住,在企业管理器中查询超时, 只有关闭应用程序企业管理器才能查询A表。而所作的更新在应用程序关闭后没有生效,而我并没有启动Adoconnection的事务。 何故? 请那位兄弟分析一下. 下面是更新代码.
function TFormFenLeiNumSetting.Save(iWeiZhi : integer; sID , sID_Desc : string) : boolean;
var
  AQuery : TADOQuery;
begin
  Result := false;
  AQuery := TADOQuery.Create(nil);
  AQuery.Connection := FormDMEquip.ADOConnequip; //连接控件
  AQuery.Close;
  AQuery.SQL.Clear;
  AQuery.Sql.Text := 'Update A Set ID_DESC = ''' + sID_Desc + ''' Where WeiZhi = '    
         + intToStr(iWeiZhi) + ' and ID = ''' + sID + '''';  try
    AQuery.ExecSQL;
    Result := true;
  except
      On E : Exception do
        MyShowErrMessage('错误原因:' + #13#10 + E.Message);
  end;
  AQuery.Close;
  AQuery.Free;
  //此处重新读取表A显示在界面,显示更新成功。
end;

解决方案 »

  1.   

    DBMS会自动把一条SQL当成一个事务处理
      

  2.   

    这张表就三个字段,每个字段几个字母,更新的数据一共才3个字母。设置了一个双字段的主键。对SQL 2000不是太清楚,程序运行更新直到退出前表都被锁住, 在企业管理器的‘锁/对象’中可以看到三个项目,都是对这个表的锁定,就一个进程,锁类型分别是Pag/Tab/Key, 模式分别为IX/IX/X, 状态Grant,所有者Xact。
    何故? 解答为盼!
      

  3.   

    不清楚。但好像在PB里这种情况应该加一个COMMIT;来提交一整次的数据库操作事务。
      

  4.   


     在delphi里也是这种情况应该加一个COMMIT;来提交一整次的数据库操作事务
      

  5.   

    ADOConnection.Execute('SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED');
      

  6.   

    ADOConnection.Execute('SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED');
    什么意思?
    是提交事务吗
    如果ADOConnection没有显式启动事务,有必要用提交吗?
    我在程序中更新部分的前和后都加入了if ADOConnection.IsTransaction then showMessage。。
    并且没有事务活动。
      

  7.   

    在 TCustomADODataSet 中有可能会隐含的启动事务。你可以试着在 AQuery.ExecSQL 之前,打开 ADOConnection,然后执行上述语句。SQL Server 在启动事务的时候,会进行表级锁定。 而执行上述语句,会降低事务的隔离级别。不过,这种方法有可能导致数据完整性的破坏。