ADODataSet的UpdateBatch问题

看过好多主从数据表更新保存的操作,都不能解决我遇到的问题,问题是这样的:
主从表结构,设置两个表的
CursorType: ctKeyset,
CursorLocation: clUseClient,
LockType: ltBatchOptimistic
然后用MasterField关联起来两表,在新增一个单据时,主表输入数据,从表输入数据,
当保存时,原来我的保存是这样的:
  if not DM.ADOConnection1.InTransaction then
  begin
    DM.ADOConnection1.BeginTrans;
    try
      ItemDataSet.UpdateBatch;
      MasterDataSet.updatebatch;
      DM.ADOConnection1.CommitTrans;
    except
      DM.ADOConnection1.RollbackTrans;
      Application.messagebox('数据保存失败!请检查编码是否重复。',p_msgTitle,MB_OK+mb_iconwarning);
    end;
  end
  else
  begin
    Application.MessageBox('服务器忙请稍后再试!',p_msgTitle,MB_OK+mb_iconWarning);
  end;

在这种情况下,如果从表保存失败,最常见的问题是从表有重复的记录,那么就会出错,然后删掉重复的记录回来,再保存,不会有什么问题,然而,实际上从表的数据根本就没有保存进去,而仅仅成功保存的是主表的数据!!!

原因是:因为在从表UpdateBatch之前,系统默认调用Post,这样就从表就不能返回到以前的状态,所以不能更新,而在UpdateBatch之前遍历从表数据,找出重复的记录删除掉,我觉得代码上比较麻烦,所以我就想,既然系统默认调用Post,我何不手工调用Post,捕捉错误,然后处理掉这个错误,再回来保存,那不就有可能成功吗?
于是就有了下面这段代码:
  try
    ItemDataSet.Post;   //保存之前先Post,如果出错,则不保存,置于编辑状态
    ItemDataSet.UpdateBatch;
    MasterDataSet.Post;
    MasterDataSet.Edit;
    ItemDataSet.Edit;
  except
    Application.messagebox('数据保存失败!请检查编码是否重复。',p_msgTitle,MB_OK+mb_iconwarning);
    MasterDataSet.Edit;
    ItemDataSet.Edit;
    Abort;
  end;

  if not DM.ADOConnection1.InTransaction then
  begin
    DM.ADOConnection1.BeginTrans;
    try
      ItemDataSet.UpdateBatch;
      MasterDataSet.updatebatch;
      DM.ADOConnection1.CommitTrans;
    except
      DM.ADOConnection1.RollbackTrans;
      Application.messagebox('数据保存失败!请检查编码是否重复。',p_msgTitle,MB_OK+mb_iconwarning);
    end;
  end
  else
  begin
    Application.MessageBox('服务器忙请稍后再试!',p_msgTitle,MB_OK+mb_iconWarning);
  end;

非常抱歉,我在代码中遗漏了一些声明。请在 `uses` 部分添加 `DB` 单元,然后重新编译代码。以下是更新后的代码: ```delphi uses ADODB, ComObj, DB, Grids, DBGrids; procedure TForm1.FormCreate(Sender: TObject); var ADOConnection: TADOConnection; ADOQuery: TADOQuery; I: Integer; begin // 创建 ADO 连接组件 ADOConnection := TADOConnection.Create(nil); ADOConnection.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\path\to\your\database.mdb'; // 创建 ADO 查询组件 ADOQuery := TADOQuery.Create(nil); ADOQuery.Connection := ADOConnection; try // 打开数据库连接 ADOConnection.Connected := True; // 执行 SQL 查询语句 ADOQuery.SQL.Text := 'SELECT * FROM YourTable'; ADOQuery.Open; // 设置 ListView 的列 ListView1.Clear; for I := 0 to ADOQuery.Fields.Count - 1 do ListView1.Columns.Add.Caption := ADOQuery.Fields[I].DisplayName; // 将查询结果绑定到 ListView 的行中 while not ADOQuery.Eof do begin with ListView1.Items.Add do begin // 将每个字段的值添加到 ListView 的相应列中 for I := 0 to ADOQuery.Fields.Count - 1 do SubItems.Add(ADOQuery.Fields[I].AsString); end; ADOQuery.Next; end; finally // 关闭数据库连接 ADOConnection.Connected := False; // 释放资源 ADOQuery.Free; ADOConnection.Free; end; end; ``` 请确保将上述代码中的 `'C:\path\to\your\database.mdb'` 替换为您实际的 Access 数据库文件路径。另外,还需要在窗体上放置一个 ListView 控件,并将其命名为 `ListView1`。 再次抱歉给您带来的困扰,现在应该可以顺利编译和运行代码了。如果您有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值