【发布时间】: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已连接到 - 火鸟数据库
应用程序执行以下操作:
- 使用
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 的OnNewRecord 事件中:
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 事件后保持不变,是否会自动取消?
问候和感谢
赫维格
【问题讨论】: