【问题标题】:TClientDataSet OnNewRecord vs. AfterInsertTClientDataSet OnNewRecord 与 AfterInsert
【发布时间】:2017-03-21 09:56:07
【问题描述】:

我的问题是关于将记录插入到 firebird 数据库的表中。该表非常简单 - 它只有 2 列:

CREATE TABLE myTable
(
    COL_ID CHAR(36) NOT NULL CONSTRAINT PK_COL_ID PRIMARY KEY USING INDEX IX_COL_ID, 
    COL_ACRONYM VARCHAR(255)
);

在我的应用程序(c++ Builder XE10)中,我有以下星座:

  • TDataSource 连接到
  • TClientDataSet 连接到
  • TDataSetProvider 已连接到
  • 一个TFDTable 连接到
  • TFDConnection 已连接到
  • 火鸟数据库

应用程序执行以下操作:

  1. 使用TClientDataSet.Append(); 插入新行
  2. 编辑新插入的记录。
  3. 使用TClientDataSet.ApplyUpdates(-1);保存此记录

只要我手动执行第二步或编辑AfterInsert 事件中的数据,一切都会按预期进行:

__fastcall TFormMain::TFormMain(TComponent* Owner)
    : TForm(Owner)
{
    ClientDataSet1->Active = true;
}

UnicodeString TFormMain::GenerateGuid( void )
{
    // ...some fancy code creating and returning a GUID...
}

void __fastcall TFormMain::ButtonAppendClick(TObject *Sender)
{
    ClientDataSet1->Append();
}

void __fastcall TFormMain::ButtonSaveClick(TObject *Sender)
{
    ClientDataSet1->ApplyUpdates(-1);
}

void __fastcall TFormMain::ClientDataSet1AfterInsert(TDataSet *DataSet)
{
    DataSet->FieldByName( "COL_ID" )->AsString = GenerateGuid();
    DataSet->FieldByName( "COL_ACRONYM" )->AsString = "Whatever: this works!";
}

这很好用......到目前为止......

由于其他一些变化,我决定将数据的自动创建移到TClientDataSetOnNewRecord 事件中:

void __fastcall TFormMain::ClientDataSet1NewRecord(TDataSet *DataSet)
{
    DataSet->FieldByName( "COL_ID" )->AsString = GenerateGuid();
    DataSet->FieldByName( "COL_ACRONYM" )->AsString = "Not too good...";
}

第一次看起来不错,因为 GUI 上的 DB 控件已填充了正确的数据。但是当我点击保存按钮时,数据消失了,新记录还没有存储到数据库中——好像我取消了这个过程。

其次,我注意到,如果我在执行 ApplyUpdates() 之前手动更改其中一列,...那么记录就会被存储。

所以我只是添加了以下行用于自动发布:

void __fastcall TFormMain::ClientDataSet1NewRecord(TDataSet *DataSet)
{
    DataSet->FieldByName( "COL_ID" )->AsString = GenerateGuid();
    DataSet->FieldByName( "COL_ACRONYM" )->AsString = "Not too good...";
    DataSet->Post();
}

这个微小的变化完成了它的工作。 我现在的问题是:为什么? AfterInsert 会自动发布新记录吗? Append() 添加的记录在OnNewRecord 事件后保持不变,是否会自动取消?

问候和感谢

赫维格

【问题讨论】:

    标签: c++builder tclientdataset


    【解决方案1】:

    据我所知,TDataSetOnNewRecordAfterInsert 事件处理程序之间的区别是:

    • 编辑来自OnNewRecord 的字段值将将记录标记为已修改
    • 编辑 AfterInsert 中的字段值会将记录标记为已修改

    我猜这是问题的原因

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多