如何在插入第一条记录并将其添加到对象数组后“保存”表?

Posted

技术标签:

【中文标题】如何在插入第一条记录并将其添加到对象数组后“保存”表?【英文标题】:How to get a table "saved" after INSERTING the first record and adding it to an ARRAY of objects? 【发布时间】:2013-10-17 15:01:20 【问题描述】:

我在访问中有一个空表,并使用 SQL INSERT 语句添加数据。在我使用过程遍历表并使用 ADO 将所有值放入对象数组之后。

调试后,我可以看到该过程在表中找不到任何值,并说该表位于 EOF 并且没有从表中提取任何值。

但是,如果我终止我的应用程序(关闭程序)并再次运行它,它似乎已经“插入”并“保存”了访问中的表,然后确实在表中找到值并使用 ADO 提取它,然后插入将其放入对象数组中。

不知何故我需要通过delphi“保存”访问数据库

 //inserts the new(first and following) records  
 begin
  qryVote.Active := False;
  qryVote.SQL.Text := 'insert INTO tblkandidate ([Leerder nr],Van,Naam,geboortedatum,[id nr],geslag,[sel nr],debietpunte,voogklas,deelname,stemme) VALUES ("'+leerdernr+'","'+van+'","'+naam+'",#'+gebdatum+'#,"'+idnr+'","'+geslag+'","'+selnr+'",'+inttostr(debiete)+',"'+voogklas+'","'+booltostr(bsport)+'",'+inttostr(stemme)+') ';
  qryVote.ExecSQL; 
  qryVote.SQL.Text := 'select * from tblkandidate';
  qryVote.Active := true;

  KandidateNaSkik; //procedure that goes through the table and puts every record into the array of objects (see below foe precedure)
  showmessage('Jou pesoonlike data is gestoor');
end;

procedure Tfrmvote.KandidateNaSkik;
var
    leerdernr,naam,van,idnr,selnr,voogklas,gebdatum,geslag : STRING;
    stemme, debiete: integer;
    bsport, gestem : boolean;
begin

frmvote.ADOTableVotek.open;

 with dbgviewp.DataSource.DataSet do
 begin
   frmvote.ADOTableVotek.first;

   iaantkan :=0;

   while not frmvote.ADOTableVotek.EOF do    
   begin

   inc(iaantkan);
   leerdernr := frmvote.ADOTableVotek['LEERDER NR']; 
   van := frmvote.ADOTableVotek['VAN'];
   naam := frmvote.ADOTableVotek['NAAM'];
   gebdatum := frmvote.ADOTableVotek['geboortedatum'];
   idnr := frmvote.ADOTableVotek['id nr'];
   geslag := frmvote.ADOTableVotek['geslag'];
   selnr := frmvote.ADOTableVotek['sel nr'];
   debiete := frmvote.ADOTableVotek['debietpunte'];
   voogklas := frmvote.ADOTableVotek['voogklas'];
   bsport := frmvote.ADOTableVotek['deelname'];
   stemme := frmvote.ADOTableVotek['stemme'];
   gestem := frmvote.ADOTableVotek['gestem'];

   //the above variables get sent to the array below

   arrkandidaat[iaantkan] := tVerkiesing.create(leerdernr, van, naam, 
        gebdatum,idnr,geslag,selnr,debiete,voogklas,bsport,gestem,stemme);

   frmvote.ADOTableVotek.Next;
end;while

end;with

end;

【问题讨论】:

谢谢一百万!!像魅力一样工作 您参考了哪个答案?如果它对你有帮助,你应该accept它。 【参考方案1】:

由于您通过qryVote.ExecSQL 插入记录,ADOTableVotek 数据集并不“知道”新记录已添加到数据库中,因此您可以调用:

frmvote.ADOTableVotek.Requery;

例如:

procedure Tfrmvote.KandidateNaSkik;
begin
  ...
  if not frmvote.ADOTableVotek.Active then
    frmvote.ADOTableVotek.Open
  else
    frmvote.ADOTableVotek.Requery;
  ...
end;

或通过ADOTableVotek 本身添加新记录,如下所示:

 ADOTableVotek.Append; // add new record
 ADOTableVotek.FieldByName('Leerder nr').AsString := leerdernr;
 // ADOTableVotek.FieldByName('etc..')...
 // etc...
 ADOTableVotek.Post; // post new record to the DB

这些更改将立即反映在 ADOTableVotek 和您的 dbgviewp 中。 这样ADOTableVotek 可以始终处于活动状态。您只需调用一次ADOTableVotek.Open(或设置ADOTableVotek.Active := True)。而且您无需在每次插入新记录时都从数据库中获取所有记录。

【讨论】:

【参考方案2】:

为了反映更改,请尝试关闭并重新打开数据集,像这样

frmvote.ADOTableVotek.Close;
frmvote.ADOTableVotek.Open;

【讨论】:

以上是关于如何在插入第一条记录并将其添加到对象数组后“保存”表?的主要内容,如果未能解决你的问题,请参考以下文章

php检索插入的最后一条记录的ID并将其插入另一个表中

如何将对象添加到数组

尝试将一组对象保存到 Firestore 并将其加载回来

如何使用事件侦听器向对象数组添加新元素并将其显示在 html 页面上

插入排序

如何在 SQL 中向后运行 UPDATE 命令(最后一条记录到第一条)?