我的问题是如何将记录插入到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)中,我有以下星座:
应用程序执行以下操作:
TClientDataSet.Append();插入新行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!";
}效果很好..。目前为止..。
由于其他一些变化,我决定将数据的自动创建移到TClientDataSet的TClientDataSet事件中。
void __fastcall TFormMain::ClientDataSet1NewRecord(TDataSet *DataSet)
{
DataSet->FieldByName( "COL_ID" )->AsString = GenerateGuid();
DataSet->FieldByName( "COL_ACRONYM" )->AsString = "Not too good...";
}在第一时间,它看起来很好,因为GUI上的DB控件已经填充了正确的数据。但是,一旦我点击了Save,数据就会消失,新记录还没有被存储到数据库中--就好像我取消了这个进程一样。
其次,我注意到,如果在执行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事件后保持不变时是否会自动取消?
问候和感谢
赫维希
发布于 2020-12-09 09:10:01
据我所知,TDataSet的OnNewRecord和AfterInsert事件处理程序之间的区别是:
OnNewRecord编辑字段值将而不是标记为修改后的记录AfterInsert编辑字段值将标记已修改的记录我想这就是问题的原因
https://stackoverflow.com/questions/42923638
复制相似问题