首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TClientDataSet OnNewRecord与AfterInsert

TClientDataSet OnNewRecord与AfterInsert
EN

Stack Overflow用户
提问于 2017-03-21 09:56:07
回答 1查看 175关注 0票数 2

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

代码语言:javascript
复制
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)中,我有以下星座:

  • 连接到
  • 连接到
  • 连接到
  • 连接到
  • 连接到
  • 火鸟数据库

应用程序执行以下操作:

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

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

代码语言:javascript
复制
__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!";
}

效果很好..。目前为止..。

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

代码语言:javascript
复制
void __fastcall TFormMain::ClientDataSet1NewRecord(TDataSet *DataSet)
{
    DataSet->FieldByName( "COL_ID" )->AsString = GenerateGuid();
    DataSet->FieldByName( "COL_ACRONYM" )->AsString = "Not too good...";
}

在第一时间,它看起来很好,因为GUI上的DB控件已经填充了正确的数据。但是,一旦我点击了Save,数据就会消失,新记录还没有被存储到数据库中--就好像我取消了这个进程一样。

其次,我注意到,如果在执行ApplyUpdates()之前手动更改其中一个列,.然后存储记录。

因此,我简单地添加了以下行,以便自动投递:

代码语言:javascript
复制
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事件后保持不变时是否会自动取消?

问候和感谢

赫维希

EN

回答 1

Stack Overflow用户

发布于 2020-12-09 09:10:01

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

  • OnNewRecord编辑字段值将而不是标记为修改后的记录
  • AfterInsert编辑字段值将标记已修改的记录

我想这就是问题的原因

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42923638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档