0

我在访问中有一个空表,并使用 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;
4

2 回答 2

3

由于您通过 插入记录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)。每次插入新记录时,您都不需要从数据库中获取所有记录。

于 2013-10-17T19:05:56.420 回答
1

为了反映更改,请尝试关闭并重新打开数据集,如下所示

frmvote.ADOTableVotek.Close;
frmvote.ADOTableVotek.Open;
于 2013-10-17T16:56:48.887 回答